Mysql 没有(标识)唯一属性的超类型表

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位置 我了解到,几乎每个表都以某种方式包

在我开发的应用程序中,有时会出现需要超类型/子类型模式的情况。我的问题通常出现在子类型的专用化应用时。专业化的排他性本身可以在编程语言层轻松地实现,因此使用该模式是一项简单的任务。但是,有时超级类型本身没有标识属性(列),除了id之外,id存在于我创建的每个表中。每个子类型表中都规定了实际标识。通过标识,我指的是具有唯一值的列的组合,如:

  • 在a
    国家/地区
    表a
    名称
  • 在a
    表a
    国家id
    +
    名称
  • car\u wheels
    表a中
    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。子类型(在您的情况下是特殊文档)是一个文档

在这种情况下,您有三种类型的数据:

  • 公共数据(在您的情况下,这将是docID、名称、作者和状态信息以及docType(作为边表的FK或独立文件)
  • 可重写数据:超级类型或它的一个边表定义了一个默认值,特殊的文档行可能会否决这个值(在您的情况下,可能是关于权限、可访问性…)
  • 专用数据:属于专用类型但不属于所有文档类型的数据
  • 通常情况下,您会使用每个专用文档类型的视图来传递超级类型和派生类型的复合数据,使其表现为一个表。使用SQL Server,您可以使用模式绑定、索引和约束来定义此类视图

    从你的问题来看,我并不完全清楚,你不想改变基本概念。没问题,坚持你的doc表,但想想下面的问题:你真的需要专门的表来处理不同的doc类型吗?你唯一的例子在所有情况下都是“name”,这是一个非常常见的信息,应该放在超级表中。它的好处是什么?对于PDF、文档和HTML,哪些信息是如此独特,以至于需要几个不同的表

    在我们最大的项目中,我们只有一个用于所有类型文档的文档表,我真的想不出离开它有什么好处…有些列可以为空,并且在任何情况下都不填充,这绝对足够了


    祝你好运,找到最合适的概念!

    嗨,如果我的答案有用的话,请你投票并/或将其标记为接受,谢谢!@Shnugo我不这么认为,因为
    文档
    表被其他几个表引用,也就是说,它有自己的子系统,适用于docum的所有子类型所以问题仍然存在。嗨,如果你能解决你的问题,我真的很感兴趣?在这里投入相当多的精力:-)如果问题真的是:哪些列应该是超级表的一部分并且是唯一的候选键?也许你必须接受一个简单的答案:没有。。。