【发布时间】:2012-08-18 12:19:45
【问题描述】:
我有一个数据库设计,我想获得一些反馈/帮助。
我有 3 个不同的实体:Cities、TimeZones、Rules。
-
City与 1 相关联,并且仅与 1 个TimeZone相关联(不是 1:只有 1) -
TimeZone可能与许多Cities相关联(不确定城市的最小数量)。 -
TimeZone正好有 2 个Rules(DST 和 ST)。 - 每个
Rule可能与许多不同的TimeZones相关联
我使用 ORM 设计器设计我的表格只是为了帮助我进行可视化:
在这个 ORM 中,有:
- 父
TimeZones和子Cities之间的一对多关系 - 父
TimeZones和子TimeZoneRule之间的一对多关系 - 父
Rule和子TimeZoneRule之间的一对多关系
现在回答我的问题:
这种多对多连接表可以工作吗?
我怎么知道
Rule属于什么TimeZone?我有TimeZone.RuleName属性来获取Rule的TimeZone但是如果我想倒退,说找到所有适用于规则的TimeZones?-
我如何使用字符串 (
RuleName) 来查找 TimeZone 的Rule,因为TimeZone有 2 条规则(名称相同但 ID 不同/唯一)。 如何使用正确的 ID/行填充此联结表?
我知道
City有一个TimeZoneId,我为其添加了实际值,我可以使用这个TimeZoneId来查找TimeZone和City所属,但我怎么能找到所有Cities和TimeZone包含?
下面我粘贴了我为创建这些表而编写的 TSQL 代码,我唯一没有的是关联,因为我从未在 TSQL 中建立关联(很明显)。
USE World_Time
IF OBJECT_ID('timezones', 'U') IS NOT NULL
DROP TABLE timezones;
IF OBJECT_ID('rules', 'U') IS NOT NULL
DROP TABLE rules;
IF OBJECT_ID('leaps', 'U') IS NOT NULL
DROP TABLE leaps;
IF OBJECT_ID('cities', 'U') IS NOT NULL
DROP TABLE cities;
IF OBJECT_ID('timezone_rule', 'U') IS NOT NULL
DROP TABLE timezone_rule;
CREATE TABLE timezones
(
[id] INT NOT NULL PRIMARY KEY,
[name] VARCHAR(30) NOT NULL,
[bias] SMALLINT NOT NULL,
[rule_name] VARCHAR(10),
[tz_abreviation] VARCHAR(7) NOT NULL,
[country_code] CHAR(2) NOT NULL,
[country_name] VARCHAR(42) NOT NULL,
[comments] VARCHAR(100),
[coordinates] VARCHAR(20),
[version] ROWVERSION
);
CREATE TABLE rules
(
[id] INT NOT NULL IDENTITY PRIMARY KEY,
[name] VARCHAR(10) NOT NULL,
[bias] SMALLINT NOT NULL,
[start_year] SMALLINT NOT NULL,
[end_year] SMALLINT NOT NULL,
[month] TINYINT NOT NULL,
[date] VARCHAR(7) NOT NULL,
[time] TIME(0) NOT NULL,
[time_type] CHAR(1),
[letter] CHAR(1),
[version] ROWVERSION
);
CREATE TABLE leaps
(
[id] INT NOT NULL IDENTITY PRIMARY KEY,
[year] SMALLINT NOT NULL,
[month] VARCHAR(3),
[day] SMALLINT NOT NULL,
[time] TIME(0) NOT NULL,
[correction] VARCHAR(1) NOT NULL,
[rs] VARCHAR(1) NOT NULL,
[version] ROWVERSION
);
CREATE TABLE cities
(
[id] INT NOT NULL IDENTITY PRIMARY KEY,
[name] VARCHAR(200) NOT NULL,
[ascii_name] VARCHAR(200),
[alternate_names] VARCHAR(5000),
[latitude] FLOAT(24),
[longitude] FLOAT(24),
[feature_class] CHAR(1),
[feature_code] VARCHAR(10),
[country_code] CHAR(2) NOT NULL,
[country_code2] VARCHAR(60),
[population] BIGINT,
[elevation] INT,
[modification_date] DATETIME NOT NULL,
[admin1code] VARCHAR(20),
[admin2code] VARCHAR(80),
[admin3code] VARCHAR(20),
[admin4code] VARCHAR(20),
[gtopo30] INT,
[timezone_id] INT NOT NULL,
[timezone_name] VARCHAR(60) NOT NULL,
[version] ROWVERSION
);
CREATE TABLE timezone_rule
(
[timezone_id] INT NOT NULL,
[rule_id] INT NOT NULL,
PRIMARY KEY (timezone_id, rule_id),
[version] ROWVERSION
);
-- Is this how I would populate the junction table?
--INSERT INTO timezone_rule
-- (timezone_id)
--SELECT id
--FROM timezones;
--INSERT INTO timezone_rule
-- (rule_id)
--SELECT id
--FROM rules;
对于我几个月来一直试图这样做的可怕帖子,我很抱歉,我厌倦了每天几个小时的 Binging/谷歌搜索:P 感谢您花时间阅读,非常感谢/
-弗朗西斯科
【问题讨论】:
标签: sql orm foreign-keys many-to-many relation