2

最初,我从Food Source 1的 excel 文档中导入食物,它具有 VARCHAR 类型 primary* (PK 示例 #FOOD0001)* (因为当时只有 1 个源,我刚刚直接导入具有自动递增 int ID 的食物表)

但我需要从具有完全主键类型 (INT) 的另一个来源Food Source 2导入食物(PK 示例 #25928747)

我目前有:

食物表

名称FoodId<PK>_

份量表

INT ServingId<PK>, FoodId<FK>, 名称, 大小

最好的数据库设计是什么,以便可以导入任何不会影响当前 ID 的食物来源,或者至少有一个映射,以便可以轻松更新、删除食物等?出于性能原因,我不想将 ID 更改为 VARCHAR

我的一个想法是在我的食物表中引入一个FoodSourceFoodId,它具有来自食物源的原始ID,这样如果食物从食物源更改/更新,那么它可以很容易地在食物表中更新?

食物表

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 数据类型时。

建议:使用“子类型”表,包括它们各自的“自然”键,用于每个源和单个“超类型”表,以使用您的人工键合并它们,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 回答
1

这似乎是一个不错的计划。另一个更常见的选择是使用INT FoodID作为外键的支持表(食物表)和VARCHAR ID. 然后,当您不再需要支持导入时,您可以折腾桌子。

于 2011-11-01T03:37:56.110 回答