最初我从食物来源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相关
你认为这是要走的路吗?或者你会建议其他什么?
答案 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
。然后,当您不再需要支持导入时,您可以只丢桌子。