2

最初に、 Food Source 1の Excel ドキュメントから食品をインポートしていましたが、VARCHAR タイプが primary* (PK example #FOOD0001)* でし た (その時点でソースが 1 つしかなかったため、自動インクリメント int ID を使用して食品テーブルに直接インポートしたためです) )

しかし、完全に主キータイプ (INT) を持つ 別のソースFood Source 2から食品をインポートする必要があります(PK の例 #25928747)。

私は現在持っています:

食品表

INT FoodId<PK>、名前

サービングテーブル

INT ServingId<PK>, FoodId<FK>, 名前, サイズ

現在のIDに影響を与えない、または少なくとも食品を簡単に更新、削除できるようにマッピングを持っている食品ソースをインポートできるようにするための最良のデータベース設計は何ですか? パフォーマンス上の理由から ID を VARCHAR に変更したくない

私が持っている 1 つのアイデアは、食品ソースからの元の ID を持つ FoodSourceFoodId を食品テーブルに導入することです。そのようにして、食品が食品ソースから変更/更新された場合、食品テーブルで簡単に更新できますか?

食品表

INT FoodId<PK>, *VARCHAR FoodSourceFoodId*, Name
      1               #FOOD0001             Food 1
      2               #FOOD0002             Food 2
      3               25928747              Food 1
      4               25928748              Food 2

同様に、サービング ID がソース データのサービング ID に関連している可能性のあるサービング テーブルに対しても同じことを行うことができます。

これが進むべき道だと思いますか?それとも何か他のものを提案しますか?

4

2 に答える 2

2

問題の型が異なる SQL データ型にマップされる場合は特に、同じ列の 2 つの異なる型 (ドメイン) からの値をモデル化しないことをお勧めします。

FoodId提案:各ソースにそれぞれの「自然」キーを含む「サブタイプ」テーブルを使用し、単一の「スーパータイプ」テーブルを使用して、人工キーを使用してそれらを統合します。

CREATE TABLE Foods
(
 FoodId INTEGER NOT NULL UNIQUE, 
 Name CHAR(6) NOT NULL 
    CHECK (Name IN ('Food 1', 'Food 2')), 
 UNIQUE (Name, FoodId)
);

CREATE TABLE Foods1
(
 FoodId INTEGER NOT NULL UNIQUE, 
 Name CHAR(6) NOT NULL 
    CHECK (Name = 'Food 1'), 
 FOREIGN KEY (Name, FoodId)
    REFERENCES Foods (Name, FoodId)
    ON DELETE CASCADE
    ON UPDATE CASCADE, 
 Food1_ID CHAR(9) NOT NULL UNIQUE 
    CHECK (Food1_ID LIKE '#FOOD[0-9][0-9][0-9][0-9]')
);

CREATE TABLE Foods2
(
 FoodId INTEGER NOT NULL UNIQUE, 
 Name CHAR(6) NOT NULL 
    CHECK (Name = 'Food 2'), 
 FOREIGN KEY (Name, FoodId)
    REFERENCES Foods (Name, FoodId)
    ON DELETE CASCADE
    ON UPDATE CASCADE, 
 Food2_ID INTEGER NOT NULL UNIQUE
);
于 2011-11-01T09:36:31.647 に答える