gpt4 book ai didi

sql - 数据库设计 : Primary key from multiple data sources

转载 作者:行者123 更新时间:2023-12-04 06:09:18 26 4
gpt4 key购买 nike

最初,我从 的 Excel 文档中导入食物。食物来源1 它有 VARCHAR 类型 primary* (PK 示例#FOOD0001)* (因为当时只有 1 个源,我直接使用自动递增的 int ID 将其导入到食品表中)

但我需要从其他来源进口食品 食源2 具有完全主键类型 (INT) (PK 示例 #25928747)

我目前有:

食物表

INT FoodId<PK>, Name



份量表

INT ServingId<PK>, FoodId<FK>, Name, Size



什么是最好的数据库设计,以便可以导入任何不会影响当前 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 相关

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

最佳答案

我建议不要对同一列中两种不同类型(域)的值进行建模,尤其是当所讨论的类型映射到不同的 SQL 数据类型时。

建议:为每个源使用一个“子类型”表,包括它们各自的“自然”键,并使用一个“父类(super class)型”表来使用您的人工键合并它们 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
);

关于sql - 数据库设计 : Primary key from multiple data sources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com