0

改写问题:

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

对象有三列:id、name、type

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

objectOwnerRelation 有三列:id、objectId、ownerId

objectId = 对象中的 id

ownerId = 所有者中的 ID

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

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

4

4 回答 4

3

没有办法强制执行约束:

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

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

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

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

于 2012-10-21T12:04:41.540 回答
0

您必须更改 objectOwnerRelation 的结构

ownerid、objectid 和 PK

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

于 2012-10-21T11:53:45.657 回答
0

这意味着两个具有相同名称和类型的对象不能出现在具有相同 ownerId 的 objectOwnerRelation 中。


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


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

所以这是简单的解决方案

在此处输入图像描述


现在麻烦的句子

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

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

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

<rant>

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

</rant>

于 2012-10-21T16:16:31.770 回答
0

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

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

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

于 2012-10-22T13:05:37.933 回答