使用外键建议数据库完整性

时间:2014-05-29 09:55:40

标签: mysql sql database-design relational-database

我尝试创建一个满足我需求的数据库设计。

我非常感谢您对我的下表设计的任何建议:

enter image description here

我有两个组成部分:类别内容

每当我为这两个组件中的任何一个创建一个新项目时,也应该创建一个新的路径项,其关系如图所示。

红色和蓝色高光与其颜色相同。

ci_routes.refidci_categories.slugci_content.slug等表中添加以下列是一种好习惯吗?

====更新====

我的应用程序的业务逻辑是这样的:

  • 我使用html表单
  • 创建一个类别项
  • 在表单提交时,应用程序将创建一个新路由以返回新创建的ci_routes.id
  • 将创建类别并填写所有信息,包括ci_categories.rid
  • 然后它再次更新ci_routes,其中包含ci_routes.slugci_categories.slug相同的所有信息,而ci_routes.route将基于配置的设置{{1}其中$path/$category_id

每当我决定将$path = 'category'更改为$path之类的内容时,我的所有路由都应根据新设置进行清除和重新创建。

请纠正我如果我在逻辑中某处犯了一些逻辑错误

1 个答案:

答案 0 :(得分:1)

  

在这些表中包含以下列是一种好习惯   的 ci_routes.refid

没有。在当前的设计中,ci_routes.refid将是一个引用两个表的列,你不能拥有一个外键而不是RDBMS中一个列的表,所以你必须在你的应用程序逻辑中处理它,这将是一个错误,努力工作。此外,您将在数据库级别中丢失数据完整性,这是不受欢迎的。

解决方案1 ​​
ci_routes中有两个单独的列引用ci_categoriesci_content,如ci_routes.content_idci_routes.categories_id

解决方案2
使用inheritance通过拥有组件和类别的基表,包含这两个实体的共享属性,具有基表,您可以在ci_routes中将其作为外键引用。

enter image description here

  

在这些表中包含以下列是不错的做法   ci_categories.slug和ci_content.slug?

回答这个问题需要有关您的业务逻辑的更多信息 顺便提一下,您将通过冗余的slug列对模型进行去标准化。如果您出于性能原因而打算这样做,那么考虑组件slug列何时更新,您将需要更新相关的rout行。在得到具体证据之前我不会这样做。