多个表中的唯一键

时间:2012-10-21 10:37:56

标签: mysql sql database-design unique

重写了这个问题:

我有三个表,对象,所有者和objectOwnerRelation

对象有三列:id,name,type

所有者有两列:id,所有者

objectOwnerRelation有三列:id,objectId,ownerId

objectId =对象中的id

所有者

ownerId = id

两个对象可以具有相同的名称和类型,但仅限于所有者不同。这意味着具有相同名称和类型的两个对象不能出现在具有相同ownerId的objectOwnerRelation中

一个对象可以拥有多个所有者,一个拥有者可以拥有多个对象。

4 个答案:

答案 0 :(得分:3)

无法强制执行约束:

  

两个对象可以具有相同的名称和类型,但仅限于所有者不同。

仅使用声明性参照完整性(DRI)。只使用DRI,您可以创建一个表,其中包含构建唯一键所需的所有列。您可以将object.nameobject.type非规范化到您的objectOwnerRelation表格。这样可以确保objectOwnerRelation中没有同名类型所有者的记录,但仅限于交集表本身。

在一天结束时, DRI不允许子表对父项施加约束。

您正在寻找的约束需要使用触发器或其他代码在程序上强制执行。

答案 1 :(得分:0)

您必须更改objectOwnerRelation的结构

所有者,objectid和PK

您可以保持结构不变并在ownerid和objectid上添加UNIQUE INDEX,但每行都可以通过ownerid和objectid

来识别

答案 2 :(得分:0)

  

这意味着无法显示具有相同名称和类型的两个对象   在具有相同ownerId的objectOwnerRelation中。


  

一个对象可以有多个所有者,一个所有者可以拥有多个   对象。


这两句话实际上非常简单,主要问题是句子以某种方式暗示对象可以根据所有者改变名称 - 因此Joel的回答。

所以这是简单的解决方案

enter image description here


现在麻烦的一句话

  

两个对象可以具有相同的名称和类型,但仅限于所有者   不同。

这是否意味着可以重命名对象?他们的类型可以由所有者重命名/更改吗?

所以 - 如您所见 - 这里的主要问题是您的问题可以通过多种方式进行(错误)解释。

<rant>

从技术上讲,这种设计在概念层面遇到了问题,在它到达实体(逻辑层面)和表格(物理层面)之前。 Evan在概念设计层面上的微小变化可能会在逻辑和物理层面上产生巨大差异 - 从提交的答案和评论到你的帖子就很明显了。

</rant>

答案 3 :(得分:0)

在你的问题中,看起来表名和类型的组合需要是每个objectownerid唯一的。

我的建议是将ownerID添加到对象并在([name],[type],[ownerid])上创建唯一索引,这样就可以强制执行约束。

允许保持当前结构的另一个解决方案是在表上创建应该强制执行约束的触发器,在违反约束的情况下执行检查和回滚。