【问题标题】:Unique key across multiple tables跨多个表的唯一键
【发布时间】:2012-10-21 10:37:55
【问题描述】:

重写问题:

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

objects 有三列:id、name、type

owners 有两列:id、owner

objectOwnerRelation 有三列:id、objectId、ownerId

objectId = 对象中的 id

ownerId = 所有者 ID

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

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

【问题讨论】:

  • 你能举个例子吗?
  • 不确定您的问题是什么,但您希望一个所有者只能有一个名字吗?
  • 编辑了问题,使其更易于理解。

标签: mysql sql database-design unique


【解决方案1】:

没有办法强制执行约束:

两个对象可以具有相同的名称和类型,但前提是所有者不同。

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

归根结底,DRI 不允许子表对父表施加约束。

您正在寻找的约束需要使用触发器或其他代码以程序方式施加。

【讨论】:

    【解决方案2】:

    你必须改变objectOwnerRelation的结构

    ownerid、objectid 和 PK

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

    【讨论】:

    • 主键并缩短为 PK(作为标准)
    【解决方案3】:

    也就是说不能出现两个同名同类型的对象 在 objectOwnerRelation 中具有相同的 ownerId。


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


    这两句话实际上很简单,主要问题是这句话以某种方式暗示对象可以根据所有者更改名称——因此乔尔的回答。

    所以这里是简单的解决方案


    现在麻烦的句子

    两个对象可以具有相同的名称和类型,但前提是所有者是 不同。

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

    所以——如你所见——这里的主要问题是你的问题可能会被(错误)以多种方式解释。

    <rant>

    从技术上讲,这个设计在概念层面遇到了问题,远在它到达实体(逻辑层面)和表格(物理层面)之前。 Evan 在设计概念层面上的微小变化可能会在逻辑和物理层面上产生巨大差异——从提交的答案和帖子中的 cmets 显而易见。

    </rant>

    【讨论】:

    • 我对@9​​87654324@ 的意思是两个对象可以具有相同的名称和类型,但前提是它们连接到两个不同的人。
    【解决方案4】:

    在您的问题中,表名和类型的组合似乎需要每个 objectownerid 都是唯一的。

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

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

    【讨论】:

    • 我不认为向对象添加 ownerID 会起作用,因为它是多对多关系。
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2022-11-26
    • 2018-09-14
    • 2021-12-13
    相关资源
    最近更新 更多