数据库设计:来自多个数据源的主键

时间:2011-11-01 03:32:12

标签: sql database-design primary-key primary-key-design

最初我从食物来源1 的excel文件中导入食物,它有VARCHAR类型的主要* (PK示例#FOOD0001)* (因为那里当我刚刚直接导入到食物表中时,只有1个来源,自动递增int ID)

但是我需要从其他来源食物来源2 导入食物,其中包含完全主键类型(INT) (PK示例#25928747) < /强>

我目前有:

食物表

  

INT 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相关

你认为这是要走的路吗?或者你会建议其他什么?

2 个答案:

答案 0 :(得分: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
);

答案 1 :(得分:1)

这似乎是一个很好的计划。另一个更常见的选择是创建一个支持表,其中INT FoodID作为外键(对于食物表)和VARCHAR ID。然后,当您不再需要支持导入时,您可以只丢桌子。