0

我有一个数据库设计,我想获得一些反馈/帮助。

我有 3 个不同的实体:Cities, TimeZones, Rules.

  • aCity与 1 相关联且仅与 1 相关联TimeZone(不是 < 1,不是 > 1:仅 1)
  • aTimeZone可能与许多相关联Cities(不确定城市的最小数量)。
  • aTimeZone正好是 2 Rules(DST 和 ST)。
  • 每个都Rule可能与许多不同的TimeZones

我使用 ORM 设计器设计了我的表格,只是为了帮助我可视化:

我的数据库 ORM

在这个 ORM 中,有:

  • TimeZones父母和孩子之间的一对多关系Cities
  • TimeZones父母和孩子之间的一对多关系TimeZoneRule
  • Rule父母和孩子之间的一对多关系TimeZoneRule

现在我的问题:

  • 这个多对多连接表可以工作吗?

  • 我怎么知道什么Rule属于什么TimeZone?我有TimeZone.RuleName获取Rulea的属性,TimeZone但是如果我想倒退,说找到所有TimeZones适用于规则的内容?

  • 我如何使用字符串 ( RuleName) 来查找 TimeZone,Rule因为 aTimeZone有 2 条规则(名称相同但 ID 不同/唯一)。

  • 如何使用正确的 ID/行填充此联结表?

  • 我知道City有一个TimeZoneId我添加了实际值的 a,我可以使用它TimeZoneId来查找TimeZoneaCity所属的,但是我怎样才能找到所有CitiesaTimeZone包含的内容?

下面我粘贴了我为创建这些表而编写的 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 感谢您抽出时间阅读,我真的很感激/

-弗朗西斯科

4

1 回答 1

0

我将跳过关于您是否真的需要/应该这样做而不是使用标准库的部分,而只是解决时区映射到两个规则的问题。

Timezone有一个RuleId。它可以有两个RuleIds:

  • DstRuleId
  • StruleId

例如:

        CREATE TABLE timezones
        (
            [id] INT NOT NULL PRIMARY KEY,
            [name] VARCHAR(30) NOT NULL,
            [bias] SMALLINT NOT NULL,

            [dst_rule_id] INT,
            [st_rule_id]  INT,

            [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
        );

那将是最简单的。为了获得更大的灵活性,并沿着更关系的路线走下去,RuleType可以引入一个表,该表仅以两个条目开头:

  • 夏令时
  • 英石

这将允许将来扩展规则的能力。但是,您需要从Rule表到RuleType表的映射,并且TimeZoneRule表将引用这些映射。如果高度确信这不会改变,则使用 DstRuleId 和 StRuleId 会更容易。

  • 查找规则适用的所有时区?

    SELECT timezoneid FROM TimeZoneRule WHERE RuleId = ?

  • 我如何使用字符串 (RuleName) 来查找 TimeZone 的规则,因为 TimeZone 有 2 条规则(名称相同但 ID 不同/唯一)。

    如果您在 TimeZoneRule 中有两列,则为隐式

  • 如何使用正确的 ID/行填充此联结表?

    INSERT INTO timezone_rule(timezone_id, rule_id) VALUES (?, ?)

  • 我知道 City 有一个 TimeZoneId,我为其添加了实际值,我可以使用这个 TimeZoneId 来查找 City 所属的 TimeZone,但是如何找到 TimeZone 包含的所有 Cities?

    SELECT id FROM city WHERE timezone_id = ?

于 2012-08-23T03:09:11.760 回答