0

私は3つの列を持っています:

-> person(varchar(50))
-> related_with(varchar(50))
-> relationship(varchar(50))

上記3つの組み合わせが主キー

たとえば、値は次のように 3 つの列に指定されます。

person -> User
related_with -> User1
relationship -> Son of

問題は、値を次のように追加すると

person -> User1
related_with -> User
relationship -> Son of 

その後、正常に挿入されます..しかし、この場合の逆は真ではないため、これは当てはまりません

この問題の解決策はありますか??

4

2 に答える 2

1

ほとんどの場合、このような検証はアプリケーションコードレベルで行う必要があります。ただし、データベースで実行する必要がある場合は、トリガーを作成することを検討してください。

これは確かに複雑なロジックと検証(アプリケーションまたはトリガーのいずれか)です。さまざまなケースが考えられます。1。を検討しrelationship -> friend ofます。ここでは、とは異なり、逆の関係が当てはまりますson of

  1. を考えてみましょうrelationship -> brother of。この場合、両方のユーザーが男性の場合は逆の関係が可能ですが、ユーザーが女性の場合は逆の関係はありません。同上relationship -> sister of

したがって、保存方法を慎重にデバイス化して、関係を参照する必要があります。ロジックを強化したり、フラグを使用して関係のタイプを識別したりする場合も同様です。

于 2012-08-23T10:29:08.193 に答える
1

(person, related_with) をキーにします。「兄弟」のような相互関係は暗黙的であるため、それらを表すために必ずしも 2 つの行が必要というわけではありません。これで、CHECK 制約を追加できます。

ALTER TABLE tbl ADD CONSTRAINT ck1 CHECK (person < related_with);

これは、すべての種類の関係にとって完璧なソリューションではありませんが、冗長性の量と潜在的な異常の数を減らし、トリガーの手続き型コードとしてではなく、宣言的にルールを適用します。

于 2012-08-24T02:50:54.650 に答える