0

質問を書き直しました:

私は3つのテーブル、オブジェクト、所有者、およびobjectOwnerRelationを持っています

オブジェクトには、id、name、type の 3 つの列があります。

所有者には、id、所有者の 2 つの列があります。

objectOwnerRelation には、id、objectId、ownerId の 3 つの列があります。

objectId = オブジェクト内の ID

ownerId = 所有者の ID

2 つのオブジェクトが同じ名前とタイプを持つことができますが、所有者が異なる場合に限られます。つまり、名前とタイプが同じ 2 つのオブジェクトは、同じ ownerId を持つ objectOwnerRelation には表示されません。

オブジェクトは複数の所有者を持つことができ、所有者は複数のオブジェクトを持つことができます。

4

4 に答える 4

3

制約を強制する方法はありません。

2つのオブジェクトは同じ名前とタイプを持つことができますが、所有者が異なる場合に限ります。

宣言型参照整合性(DRI)のみを使用します。DRIだけを使用して、一意のキーを作成するために必要なすべての列を含むテーブルを作成できます。あなたは非正規化object.nameobject.typeてあなたのobjectOwnerRelationテーブルに行くことができます。objectOwnerRelationこれにより、同じ名前タイプ所有者のレコードはなく、交差テーブル自体にのみ存在するようになります。

結局のところ、DRIでは、子テーブルが親に制約を課すことはできません。

探している制約は、トリガーまたはその他のコードを使用して、手続き的に課す必要があります。

于 2012-10-21T12:04:41.540 に答える
0

objectOwnerRelation の構造を変更する必要があります

両方の所有者 ID、オブジェクト ID、および PK

構造をそのままにして、所有者 ID とオブジェクト ID に UNIQUE INDEX を追加できますが、各行は所有者 ID とオブジェクト ID で識別できます。

于 2012-10-21T11:53:45.657 に答える
0

つまり、名前とタイプが同じ 2 つのオブジェクトは、同じ ownerId を持つ objectOwnerRelation には表示されません。


オブジェクトは複数の所有者を持つことができ、所有者は複数のオブジェクトを持つことができます。


これらの 2 つの文は、実際には非常に単純になります。主な問題は、オブジェクトが所有者に応じて名前を変更できることを何らかの形で暗示している文です。したがって、Joel の答えです。

だからここに簡単な解決策があります

ここに画像の説明を入力


今、厄介な文

2 つのオブジェクトが同じ名前とタイプを持つことができますが、所有者が異なる場合に限られます。

これは、オブジェクトの名前を変更できるということですか? 所有者がそのタイプの名前を変更/変更できることは?

つまり、ご覧のとおり、ここでの主な問題は、質問がさまざまな方法で (誤って) 解釈される可能性があることです。

<rant>

技術的には、この設計では、エンティティ (論理レベル) やテーブル (物理レベル) に到達するずっと前に、概念レベルで問題が発生しました。投稿への回答やコメントから明らかなように、設計の概念レベルでの Evan の小さな変更は、論理的および物理的レベルで大きな違いを生み出す可能性があります。

</rant>

于 2012-10-21T16:16:31.770 に答える
0

あなたの質問では、テーブル名とタイプの組み合わせは objectownerid ごとに一意である必要があるようです。

オブジェクトに ownerID を追加し、([name],[type],[ownerid]) に一意のインデックスを作成することをお勧めします。これにより、制約を適用できます。

現在の構造を維持できる別の解決策は、制約を適用する必要があるテーブルにトリガーを作成し、制約違反の場合にチェックとロールバックを行うことです。

于 2012-10-22T13:05:37.933 に答える