0

フィードバック/ヘルプを取得したいデータベース設計があります。

CitiesTimeZones、 の3 つの異なるエンティティがあり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ますか? forTimeZone.RuleNameをフェッチするプロパティがありますが、逆に戻りたい場合は、ルールが適用されるすべての を検索するとします。RuleTimeZoneTimeZones

  • RuleName文字列 ( ) を使用して TimeZone を検索するにはどうすればよいですか。これにRuleTimeZone2 つのルール (同じ名前で異なる/一意の ID) があるためです。

  • このジャンクション テーブルに正しい ID/行を設定するにはどうすればよいですか?

  • 実際の値を追加した a があることはわかっCityています。これを使用してa が属するものを見つけることができますが、 aに含まれるすべてのものを見つけるにはどうすればよいでしょうか?TimeZoneIdTimeZoneIdTimeZoneCityCitiesTimeZone

以下に、これらのテーブルを作成するために書いた 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;

何ヶ月もこれをやろうとしてきたばかりで、毎日何時間もビンギング/グーグルすることにうんざりしていました:P 読む時間をとってくれてありがとう, 本当に感謝しています/

-フランシスコ

4

1 に答える 1

0

標準ライブラリを使用する代わりにこれを本当に必要とする/すべきかどうかについての部分はスキップし、2 つのルールへのタイムゾーン マッピングの問題に対処します。

Timezoneを持っていRuleIdます。RuleId次の 2 つの sを持つことができます。

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

それは最も簡単です。柔軟性を高め、よりリレーショナルなルートをたどるために、RuleType2 つのエントリのみで始まるテーブルを導入できます。

  • 夏時間
  • ST

これにより、将来的にルールを拡張することが可能になります。Ruleただし、テーブルからテーブルへのマッピングが必要にRuleTypeなり、TimeZoneRuleテーブルはこれらのマッピングを参照します。これが変更されないという確信が高い場合は、DstRuleId と StRuleId を使用する方が簡単です。

  • ルールが適用されるすべてのタイム ゾーンを検索する

    SELECT timezoneid FROM TimeZoneRule WHERE RuleId = ?

  • TimeZone には 2 つのルール (同じ名前で異なる/一意の ID) があるため、文字列 (RuleName) を使用して TimeZone のルールを見つけるにはどうすればよいですか。

    TimeZoneRule に 2 つの列がある場合は暗黙的

  • このジャンクション テーブルに正しい 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 に答える