sql - 数据库子类化设计

标签 sql database database-design

我正在创建数据库项目,有一件事对我来说不太清楚。看看这个: part of database model

现在我不确定制裁剪理模型的最佳方法是什么。 TOOL 和 RESOURCE 除了 ITEM 之外不需要任何其他字段。只有 Recipe 需要新列(用于)。但我必须以某种方式将食谱与工具和资源区分开来。好的,我可以为资源和工具创建 2 个具有不同名称的相同表,一个用于配方,但是我如何处理项目呢?创建是作为 View ?那么它就不会是真正的子类化了。

或者我只是创建类似的东西:使用 (id,name,description) 创建 ITEM 表,然后只使用 (item_id) 创建 RESOURCE 那是外键和相同的工具并添加触发器,当我插入资源时它真的添加到ITEM 然后只是在资源中添加外键?这似乎是最明智的选择,但这可能吗?

最佳答案

这是一个经典的“视情况而定”的答案。答案实际上取决于潜在关系以及一个项目是否可以属于多个类型。

如果存在所有项目都可以在其中的关系,那么单个项目表会更可取,因为您的关系表中可以有一个外键列。如果存在只有特定类型的项目才能拥有的关系, 那么你需要使用 Class Table Inheritance ,所以就像你对工具所说的那样,你会 有另一个名为 Tools 的表,其中有一个引用 Item 的主键列 ItemID。这样你就可以为 Tools.ItemID 限制关系创建外键 到某种类型的元素。如果一个项目可以属于多个类型,那么您几乎肯定应该使用类表继承。

如果不需要限制关系,一个item只能属于一种类型,那么在Items表中有一个ItemType列就可以识别item类型,不需要完全使用表继承。

如果不会有超过一种itemtype可以出现的关系,而会有只能出现一种的关系那么使用3个表可能更简单,维护更少,并使用 View 组合他们,它仍然应该提供所有需要的功能。

综上所述,Inheritance会需要更多的表,更多的管理,但更灵活,所以看情况。

关于sql - 数据库子类化设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23886436/

相关文章:

mysql - 将常量引用数据存储为单个字符而不是数据库列中的整数有什么问题吗?

mysql - 映射到另一个表(其实际值保存在 MySQL 中)的表的效率

python - 选择带有 IS NULL 和值的查询

sql - PostgresQL 错误 : operator does not exist: integer = integer[]

php - 这个特定的 PDO (SQL) 语句有什么问题?

php 框架,我什么时候以及为什么需要它们?

mysql - 为什么 MySQL Workbench 在 n :m relation? 上创建两个索引

mysql - SQL - 连接子查询条件

php - 在 MySql 中获取资源 ID #3 错误

php - 如何为访问数据库的应用程序分段数据库(也称为多个用户问题的单个数据库)?