mysql - 带外键的数据库设计问题

标签 mysql database-design foreign-keys foreign-key-relationship

我正在尝试正确使用外键来维护数据完整性。我并不是一个真正的数据库专家,所以我想知道是否有一些我不知道的一般设计原则。这是我正在尝试做的事情的示例:

假设您想要建立一个包含类型(汽车、卡车等)、制造商和型号的车辆数据库。用户必须至少输入类型,但品牌和型号是可选的(如果给出型号,则需要品牌)。我的第一个想法是这样设置数据库:

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/

相关文章:

mysql - 从编程角度识别和非识别关系

mysql - 根据多个表聚合查询

database-design - 数据结构和系统设计问题

mysql - 如何在MySQL中实现先决条件表

database-design - 是否需要有一个序列生成的主键,即使我可能不会将它用于数据库操作

php - 回显结果以显示每个值的所有值

php - Mysql 获取数组 Foreach

MySQL - 获取期间下第 25 个订单的用户

python - 将数据帧写入mysql数据库

创建外键的 MySQL 语法