我有一个数据库设计,我想获得一些反馈/帮助。
我有 3 个不同的实体:Cities
, TimeZones
, Rules
.
- a
City
与 1 相关联且仅与 1 相关联TimeZone
(不是 < 1,不是 > 1:仅 1) - a
TimeZone
可能与许多相关联Cities
(不确定城市的最小数量)。 - a
TimeZone
正好是 2Rules
(DST 和 ST)。 - 每个都
Rule
可能与许多不同的TimeZones
我使用 ORM 设计器设计了我的表格,只是为了帮助我可视化:
在这个 ORM 中,有:
TimeZones
父母和孩子之间的一对多关系Cities
TimeZones
父母和孩子之间的一对多关系TimeZoneRule
Rule
父母和孩子之间的一对多关系TimeZoneRule
现在我的问题:
这个多对多连接表可以工作吗?
我怎么知道什么
Rule
属于什么TimeZone
?我有TimeZone.RuleName
获取Rule
a的属性,TimeZone
但是如果我想倒退,说找到所有TimeZones
适用于规则的内容?我如何使用字符串 (
RuleName
) 来查找 TimeZone,Rule
因为 aTimeZone
有 2 条规则(名称相同但 ID 不同/唯一)。如何使用正确的 ID/行填充此联结表?
我知道
City
有一个TimeZoneId
我添加了实际值的 a,我可以使用它TimeZoneId
来查找TimeZone
aCity
所属的,但是我怎样才能找到所有Cities
aTimeZone
包含的内容?
下面我粘贴了我为创建这些表而编写的 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 感谢您抽出时间阅读,我真的很感激/
-弗朗西斯科