我正在尝试正确使用外键来维护数据完整性。我并不是一个真正的数据库专家,所以我想知道是否有一些我不知道的一般设计原则。这是我正在尝试做的事情的示例:
假设您想要建立一个包含类型(汽车、卡车等)、制造商和型号的车辆数据库。用户必须至少输入类型,但品牌和型号是可选的(如果给出型号,则需要品牌)。我的第一个想法是这样设置数据库:
Type:
-id (PK)
-description
Make:
-id (PK)
-type_id (FK references Type:id)
-description
Model:
-id (PK)
-make_id (FK references Make:id)
-description
Vechicle:
-id (PK)
-type_id (FK references Type:id)
-make_id (FK references Make:id)
-model_id (FK references Model:id)
您将如何设置车辆的 FK 以确保类型、品牌和型号全部匹配?例如,如何防止车辆具有(类型:摩托车,品牌:福特,型号:思域)?其中每一个都是有效的 FK,但它们不维护通过其他表的 FK 显示的关系。
此外,因为不需要 Model,所以我不能只存储 model_id FK 并从中逆向工作。
我完全不受数据库设计的束缚,所以我愿意改变表的设置方式。有什么想法吗?
附注- 如果有人感兴趣的话,我正在使用 mysql,但这更多是关于数据库的一般问题。
编辑(澄清):
-车辆表中需要 type_id 和 make_id ,除非在 model_id 为空的情况下有某种方法可以计算出它们;
-需要维护 type_id、make_id 和 model_id 之间的关系。
最佳答案
您正在寻找的是 CHECK 约束。不幸的是 MySQL 目前不支持这一点。您可以使用触发器模拟此类功能,但需要创建 INSERT 和 UPDATE 触发器才能使其工作。
但是,正如其他答案所表明的那样,您真正应该存储的只是车辆型号。在您的应用程序中,您应该深入了解该类型(如果可用)。
关于mysql - 带外键的数据库设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1732549/