2

RDBMSで次の再帰的な関係を表現しようとしています。

ここに画像の説明を入力してください

基本的な例として、次のフィールドがあります。

1 - computer science
2 - computer engineering
3 - electrical engineering
4 - mathematics

そして、似たような分野を相互に関連付けたいと思います。2番目のテーブルを使用して、フィールドを相互に関連付けることができます。最適には、次のように想像できます。

+----------+----------+
| field1   | field2   |
+----------+----------+
|    4     |    1     | (math -> comp sci)
|    4     |    2     | (math -> comp eng)
|    4     |    3     | (math -> elect eng)
|    2     |    1     | (comp eng -> comp sci)
|    2     |    3     | (comp eng -> elect eng)
+----------+----------+

ただし、キーが(field1、field2)の場合、2つの潜在的な問題が発生する可能性があります。

  1. 順序付けされていなくても、タプルが複製される可能性があります
  2. どのフィールドがどの列にあるかが重要でない場合は、クエリが不必要に複雑になる可能性があります(sgeddesが指摘しているように、両方の列をクエリし、重複を除外します)

例えば:

+----------+----------+
| field1   | field2   |
+----------+----------+
|    1     |    4     | (comp sci -> math)
|    4     |    3     | (math -> elect eng)
|    4     |    2     | (math -> comp eng)
|    3     |    4     | (elect eng -> math)
|    2     |    1     | (comp eng -> comp sci)
|    3     |    2     | (elect eng -> comp eng)
|    1     |    2     | (comp sci -> comp eng)
+----------+----------+

非階層的な再帰的関係にどのようにアプローチする必要がありますか?

2番目の表のように、先に進んで各タプルを意図的に複製する必要がありますか?それとも私が見落としている別の方法はありますか?

4

2 に答える 2

1

私はそのアプローチを何度か見てきました。両方のフィールドに一致するクエリを実行し、重複した結果を除外する必要があったため、正直なところ大ファンではありませんでした。また、類似する 2 つ以上のフィールドについてはどうでしょうか。かなり乱雑になる可能性があります。

上記の例を使用すると、別のアプローチは、SimilarField テーブルを導入することです。これには、SimilarId と FieldId が格納されます (また、3 番目の Identity フィールドである SimilarFieldId を主張する人もいます)。したがって、英語と文学が類似した分野である場合、次のようになります。

SimilarId   FieldId
1           1         (English)
1           2         (Literature)

このアプローチにより、フィールドと類似のフィールドの間に 1 対 n の関係を持つことができます。

- 編集 -

あなたのコメントに応えて、あなたの例がどのように機能しないのかわかりません:

SimilarId   FieldId
1           1         (English)
1           2         (Literature)
1           3         (Reading)
2           2         (Literature)
2           4         (History)
3           4         (History)
3           5         (Art History)

グループ化された同様のフィールドは、必要な数だけ持つことができます。

たとえば、文学に関連付けられているすべてのフィールドを取得するには、クエリは次のようになります。

SELECT DISTINCT F.FieldId, F.FieldName
FROM Field F JOIN 
      SimilarField S ON F.FieldId = S.FieldId
WHERE S.SimilarId IN (
      SELECT SimilarId 
      FROM SimilarField
      WHERE FieldId = 2 
   )

そして、これがサンプルのSQL Fiddleです。

于 2013-02-14T00:39:58.250 に答える
1

重複の問題に対する一般的なアプローチの 1 つは、両方の列field1のキーと組み合わせて、タプルに常に最小の ID が含まれるようにすることです。UNIQUE次に、の条件SELECTWHERE field1 = @id OR field2 = @id.

于 2013-02-14T01:21:21.823 に答える