Mysql 关于使用外键的数据库完整性的建议

Mysql 关于使用外键的数据库完整性的建议,mysql,sql,database-design,relational-database,Mysql,Sql,Database Design,Relational Database,我试图创建一个数据库设计来满足我的需要 如果您对我的下表设计有任何建议,我将不胜感激: 我有两个组件:类别和内容 每当我为这两个组件中的任何一个创建一个新项目时,都应该创建一个新的路由项目,其关系如可视化图表所示 红色和蓝色高光与它们的颜色相同。 在那些表中包含以下列,如ci\u routes.refid、ci\u categories.slug和ci\u content.slug,是否是一种良好的做法 ==更新==== 我的应用程序的业务逻辑如下: 我用html表单创建了一个类别项 在表单

我试图创建一个数据库设计来满足我的需要

如果您对我的下表设计有任何建议,我将不胜感激:

我有两个组件:类别内容

每当我为这两个组件中的任何一个创建一个新项目时,都应该创建一个新的路由项目,其关系如可视化图表所示

红色和蓝色高光与它们的颜色相同。

在那些表中包含以下列,如
ci\u routes.refid
ci\u categories.slug
ci\u content.slug
,是否是一种良好的做法

==更新====

我的应用程序的业务逻辑如下:

  • 我用html表单创建了一个类别项
  • 在表单提交时,应用程序将创建一条新路线,以返回新创建的
    ci\u routes.id
  • 类别将被创建并填充所有信息,包括
    ci\u categories.rid
  • 然后它用
    ci\u routes.slug
    ci\u类别相同的所有信息再次更新
    ci\u路由。slug
    ci\u路由。路由将基于配置的设置,例如
    $path/$category\u id
    其中
    $path='category'
每当我决定将
$path
更改为类似
$path='node'
的内容时,我的所有路由都应该清除并基于新设置重新创建

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

在这些表中包含以下列是一种良好的做法吗 ci_routes.refid

不可以。在当前的设计中,ci_routes.refid将是一个引用两个表的列,在RDBMS中一个列上不能有多个表的外键,因此必须在应用程序逻辑中处理它,这将是一个有缺陷的、艰巨的工作。此外,您还将失去数据库级别的数据完整性,这是不受欢迎的。

解决方案1:
ci\U路由中有两个单独的列
引用
ci\U类别
ci\U内容
类似
ci\U路由。内容id
ci\U路由。类别id

解决方案2:
通过为组件和类别创建一个包含这两个实体的共享属性的基表,并在ci_路由中将其作为外键引用,可以使用


在这些表中包含以下列是一种良好的做法吗 ci_categories.slug和ci_content.slug

回答此问题需要更多关于您的业务逻辑的信息。

顺便说一句,您将通过冗余
slug
列来反规范化您的模型。如果您只是出于性能原因而这样做,那么请考虑何时更新components slug列,您将需要更新依赖的rout行。除非有具体证据,否则我不会这么做。

谢谢你的回答,莫森。我在这两个组件表中都使用slug的原因是,如果有一天我决定截断routes表以基于新设置生成新值,我想这会容易得多。但也许我错过了什么。稍后我将更新我的问题,以便更好地了解我的业务逻辑。如果您将slug保留在类别和组件中并将其从路由中删除,会发生什么情况?我想知道的是相同的,或者将其保留在
路由中并从组件表中删除,或者像您所说的,仅从路由中删除它。