1

次の問題の解決策が思いつかなくて困っています。

次のようなデータベースがあるとします。

問題表

Id | Details | CreateDate | ClosedDate

問題点の表

Id | ObjectId | Notes | NoteDate

問題の割り当て表

Id | ObjectId | AssignedToId| AssignedDate

問題を別の問題にリンクできるようにしたいと思います。ParentIssueId という名前の課題テーブルに列を追加することを考えました。これにより、課題をリンクできるようになりますが、この実装を行うと、課題テーブル内で循環参照が発生することが予測されます。これを行うためのより良い方法はありますか?もしそうなら、どのように?

ありがとう

4

3 に答える 3

1

テーブルを作成します。

LinkedIssues
IssueIDa    pk composite primary key, fk to Issue table
IssueIDb    pk composite primary key, fk to Issue table

PKはいくつかの重複を遠ざけますが、チェック制約を作成します。IssueIDa<IssueIDbそのため、次のような重複が発生することはありません。

row 1 IssueIDa=123
      IssueIDb=987

row 2 IssueIDa=987
      IssueIDb=123

ただし、次のような円を防ぐために:

row 1 IssueIDa=123
      IssueIDb=987

row 2 IssueIDa=987
      IssueIDb=456

row 3 IssueIDa=456
      IssueIDb=123

チェーンを解決し、サークルで失敗するトリガーが必要になります。この円を検出するには、再帰CTEを使用するのが最善の策です。

于 2010-04-29T17:56:23.677 に答える
1

次のような結合/リンクテーブルを追加できます。

問題リンク

IssueId | LinkedIssueId

両方の列が課題テーブルへの外部キーです。

これにより、課題を任意にリンクしたり、親スタイルの関係を使用して 1 つの課題を他の複数の課題にリンクしたりできます。

2 つの列に一意のインデックスを配置して、データが繰り返されないようにし、次のような条件がないことを確認するためにテストする必要があります。

IssueId & LinkedIssueId = LinkedIssueId & IssueId

(論理的な重複が発生します)

こちらをご覧ください: http://en.wikipedia.org/wiki/Junction_table 唯一の違いは、Junction テーブルが同じテーブルを指して 1 対多の関係を作成することです。

于 2010-04-29T17:50:05.000 に答える
0

課題が別の「親」課題に関連している可能性がある場合は、テーブルに「ParentId」列があっても問題ありません (NULL は親がないことを意味します)。問題が他の複数の問題に関連している可能性がある場合は、新しい「多対多」(または「リンク」) テーブルが必要になります。

どちらの場合でも、循環参照 (特に「循環」に 3 つ以上の問題が含まれる場合) をチェックして防止するのは難しいでしょう。循環参照をチェックし、見つかった場合は更新に失敗する CTE に基づいて更新を行うことで、UPDATE 中に円をチェックするか、最初に円をチェックし、次の場合にのみ更新を発行するストアド プロシージャで更新できます。チェックはパスします。(もちろん、並行性の問題について心配する必要があります。チェックと更新の間でデータが変更された場合はどうなるでしょうか。より複雑な場合は、CTE ベースの更新が優先されます。)

于 2010-04-29T18:33:34.620 に答える