Mysql 没有(标识)唯一属性的超类型表
在我开发的应用程序中,有时会出现需要超类型/子类型模式的情况。我的问题通常出现在子类型的专用化应用时。专业化的排他性本身可以在编程语言层轻松地实现,因此使用该模式是一项简单的任务。但是,有时超级类型本身没有标识属性(列),除了id之外,id存在于我创建的每个表中。每个子类型表中都规定了实际标识。通过标识,我指的是具有唯一值的列的组合,如:Mysql 没有(标识)唯一属性的超类型表,mysql,sql,database,subtype,Mysql,Sql,Database,Subtype,在我开发的应用程序中,有时会出现需要超类型/子类型模式的情况。我的问题通常出现在子类型的专用化应用时。专业化的排他性本身可以在编程语言层轻松地实现,因此使用该模式是一项简单的任务。但是,有时超级类型本身没有标识属性(列),除了id之外,id存在于我创建的每个表中。每个子类型表中都规定了实际标识。通过标识,我指的是具有唯一值的列的组合,如: 在a国家/地区表a名称 在a省表a国家id+名称 在car\u wheels表a中car\u id+wheel\u位置 我了解到,几乎每个表都以某种方式包
- 在a
表a国家/地区
名称
- 在a
表a省
+国家id
名称
- 在
表a中car\u wheels
+car\u id
wheel\u位置
documents
-----------------------------
id | publicly_accessible
webpage_documents
----------------------------------------------------------
id | document_id | name (as well as certain other properties, too)
ajax_script_documents
-----------------------------
id | document_id | name
pdf_documents
-----------------------------
etc...
存在引用文档的关系表
,每个文档的子类型都可能有一个自己的完整子系统。因此出现了超类型/子类型模式
如您所见,文档
表确实包含一个布尔列可公开访问
,这显然不是一个标识列。在有些情况下,甚至连这样一列也没有。这意味着超级类型表只包含一个id
列,在我看来,该列不仅有气味,而且在查看其内容时也令人困惑
我不能仅仅删除文档
超级类型,因为子类型表的数量可能会随着时间的推移而增加,并且有几个表显式引用文档
,这意味着引用文档
的表的数量必须乘以子类型的数量
所以基本上我缺少超级类型表的列标识。如何重新设计/产生一个有用的识别列?我想使用DocumentType表。此新表知道类型的名称和其他信息(常规存储位置、要查看的应用程序等) 您可以将超级表放在一边,并将此新id(带有FK)放入spread doc表中,也可以保留超级表并将其放在那里 文档是否可公开访问可以是文档类型级别的值,也可以是文档级别的值。在这样的场景中,我更喜欢一个值级联:在doc type表中可以有一个不为NULL的布尔列,在doc级别(在super表或spread表中)可以有另一个为NULL的列。如果不为空,则接受此值,并返回到您的文档类型中的默认设置
超级表只有在您使用诸如作者、创建时间、状态、上次编辑等常见信息时才有用。嗨,我将添加另一个答案,因为这对于注释来说太多了,我不想删除第一个答案 嗯,我认为你混淆了一些概念: 您的国家、省份或汽车车轮示例是“嵌套组件”。主要是1:n(1个国家,多个省份,1辆汽车,多个车轮)。有时会出现1:1的特殊情况(一辆车有一个发动机),但这不是定义,而是规则。你可以想象一辆有两个发动机(例如奥托和电池)的汽车。这不是继承(超类型[基类]、类型和子类)。嵌套类型将不适合“是a”规则。一个省不是一个国家,一个轮子不是一辆汽车 继承总是1:1。子类型(在您的情况下是特殊文档)是一个文档 在这种情况下,您有三种类型的数据:
祝你好运,找到最合适的概念!嗨,如果我的答案有用的话,请你投票并/或将其标记为接受,谢谢!@Shnugo我不这么认为,因为
文档
表被其他几个表引用,也就是说,它有自己的子系统,适用于docum的所有子类型所以问题仍然存在。嗨,如果你能解决你的问题,我真的很感兴趣?在这里投入相当多的精力:-)如果问题真的是:哪些列应该是超级表的一部分并且是唯一的候选键?也许你必须接受一个简单的答案:没有。。。