有没有办法在以下场景中维护数据库关系(pk / fk)

时间:2017-12-08 05:17:23

标签: mysql entity-framework database-design foreign-keys

我当前的数据库设计在截图中。它似乎有缺陷,因为t_criteria_director和t_criteria_a b c d e ...表之间没有强制关系(pk / fk)。是否有更好的方法来设计这一对多方案以保持参照完整性?

Proposed DB Design

1 个答案:

答案 0 :(得分:1)

你的设计并不“看似”任何东西,因为我们无法读懂你的想法。您已经给出了设计的某些方面,但没有提供它代表/实现/描述的业务“场景”或它是如何实现的。

SQL NULL,UNIQUE,PKs& FK是各种约束。约束是对可以出现的数据库值的限制。 SQL FK表示表中列列表的子行值必须出现在列表的其他位置,列列表的列中形成了SQL UNIQUE NOT NULL列集(其中PK是一个例子)。如果您的设计受到约束并且其他强制约束不暗示,则强制执行。否则不要。最好以声明的方式。大多数SQL DBMS只允许您声明一些廉价的强制约束。其他必须通过触发器强制执行。

约束是在给定情况下进入vs退出表的行的标准的结果(表谓词,“表的含义”)以及什么情况可以&根据您的业务规则不能出现。除非你告诉我们,否则我们不知道那是什么。我们希望能够使用您的桌子和列名,您提供的任何其他信息&常识。

必须告诉我们约束或谓词&什么情况可以/不会出现。

在这里,您的表格使用简单的表格和一些EAV设计来记录您设计中未明确显示的某些简单表格的数据。一如既往,你可以通过使用DDL来保持简单的表的架构和放大器来避免EAV。约束是最新的,但你选择了一个静态模式,需要更复杂的模式,查询和限制。 EAV约束的直接表达通常是它们表示的直接表具有某些约束加上t_criteria_x是它的视图和/或它是它们的视图。但通常只有可用的SQL声明才能表达它的碎片。

猜测你想要的内容包括每个t_criteria_x表的内容,其PK值必须出现在t_criteria_director中,其table_name值为“t_criteria_x”。另一种方法是,如果向t_criteria_x添加值为“t_criteria_x”的table_name列,则结果必须具有(id,table_name)子行,并显示为t_criteria_director(criteria_id,table_name)子行。如果 t_criteria_director(criteria_id,table_name)子行是SQL UNIQUE NOT NULL,那么我们已经知道扩充t_criteria_x具有引用t_criteria_director(criteria_id,table_name)的复合SQL FK(id,table_name)。您可以通过实际通过这样的(可能计算/生成/计算)列来增加t_criteria_x来声明性地表达这一点。但是您可能还有其他约束,例如t_criteria_director中没有任何(constraint_id,table_name)对没有被某些扩充的t_constraint_x引用。

调用列table_name显示来自EAV的面向实现的偏差,因为该列是ER意义上的类型/变体鉴别符/标记,即t_criteria_x中的id表示的实体类型表是由t_criteria_director表示的实体类型的“子类型”。 (这也是用于动态模拟类型的3GL记录数据结构的概念/技术。)在所有table_name列值不必是表名之后,它只需要是一些标识实体子类型的值,并且这些实体不必只参与一个表的关系/关联。 (研究SQL /数据库/ ER子类型/多态/继承和设计反模式两个/多个/多个FK [原文如此]到两个/多个/多个表。)

您必须确定表谓词是什么以及它们的约束条件。优选地,通过确定它们共同表示的简单表是什么&它的谓词是什么以及数据库约束使用它的是什么。然后,您必须决定是否要根据成本/收益修改设计以使约束声明和/或您是否要通过触发器强制执行约束。