フィードバック/ヘルプを取得したいデータベース設計があります。
Cities
、TimeZones
、 の3 つの異なるエンティティがあり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
ますか? forTimeZone.RuleName
をフェッチするプロパティがありますが、逆に戻りたい場合は、ルールが適用されるすべての を検索するとします。Rule
TimeZone
TimeZones
RuleName
文字列 ( ) を使用して TimeZone を検索するにはどうすればよいですか。これにRule
はTimeZone
2 つのルール (同じ名前で異なる/一意の ID) があるためです。このジャンクション テーブルに正しい ID/行を設定するにはどうすればよいですか?
実際の値を追加した a があることはわかっ
City
ています。これを使用してa が属するものを見つけることができますが、 aに含まれるすべてのものを見つけるにはどうすればよいでしょうか?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;
何ヶ月もこれをやろうとしてきたばかりで、毎日何時間もビンギング/グーグルすることにうんざりしていました:P 読む時間をとってくれてありがとう, 本当に感謝しています/
-フランシスコ