1

2 つのテーブル間の関係について質問があります。

テーブル users とリンクがあるとします。

users
+++++++++
id name
1  name1
2  name2
3  name3
+++++++++

links
+++++++++
id link
1  link1
2  link1
3  link1
+++++++++

これら 2 つをリンクする通常の方法は、name_links テーブルを使用することです。例えば:

name_links
++++++++++++
uid  lid
1    1
1    3
2    3
2    1
2    2
3    2
++++++++++++

今、私はこのようなテーブルを作るのが良い考えかどうか疑問に思っていました.

name_links
++++++++++++
uid  lid
1    1,3
2    1,2,3
3    2
++++++++++++

私が考えることができる長所と短所は次のとおりです。

長所1:

常にインデックスを検索します。より高速なクエリの例では、uid=1 を選択してから、リンク 1、3 を選択します。どちらもインデックスなので高速ロードになります。

1000 人のユーザーがいて、それぞれに 20 個のリンクがある場合、すべてのリンクを取得するには 20.000 レコードを通過する必要があることを意味します (これについてはわかりません)。この方法を使用すると、インデックスを 1 つだけ取得して完了です。

短所1:

name_links テーブルをより頻繁に更新し、読み取り、編集、書き込みを行う必要があります 例 ユーザー 2 は link2 を削除します メソッドは次のようになります:
+ ユーザー 1 の文字列を取得 +
文字列から番号を削除
+ 新しい文字列を挿入

ここでのすべてはインデックスで行われるため、高速になると思います。

短所2:

別の短所は、リンク 2 を削除するときに、すべての文字列を調べなければならないことですが、これはあまり問題にならないということです。

これは私がこれまでに思いついたものであり、私はプロジェクトの時点で、どちらを使用するかを決定する必要があります.

どの方法を選ぶべきか、アドバイスをいただければ幸いです。私の長所と短所は正しいですか?私が考慮していないことはありますか?このトピックに関するヘルプは大歓迎です。

君たちありがとう!

4

3 に答える 3

3

非正規化ソリューションには、次の欠点があります。

  • 名前とリンクを効率的に結合することはできません (FIND_IN_SETはサージ可能ではありません)

  • FOREIGN KEYs(in InnoDB)を使用して参照整合性を適用することはできません

  • 名前リンク関係の削除と追加はより複雑です

リンクを指定して名前を検索したことがなく、リンクの数が少ない場合は、余分な結合を取り除くことでメリットが得られる可能性があります。

パフォーマンス上の利点が実際にあること、本当に必要であること、および非正規化されたテーブルを維持することの複雑さを認識していることを確認する必要があります。

linksが修正された場合は、SET代わりにネイティブ データ型の使用を検討できます。

于 2010-02-27T22:57:16.347 に答える
0

私は決してデータベースの専門家ではありませんが、あなたの 2 番目のオプションは非常に悪い考えだと思います。たとえば、name_link テーブルでリンクによる検索を行う必要がないと仮定しても、リンクを使用して何かを行うと、多くの (不必要な、IMO) 余分な作業が発生します。

于 2010-02-27T22:55:39.580 に答える
0

絶対に必要な場合を除き、レコードを連結しないでください。将来の能力を考慮してください。たとえば、リンク 3 を持っているユーザーの数を数えたいとしましょう。これは、2 番目の方法では面倒です。

したがって、あなたの例では、これは多対多の結合になると想定しています。つまり、リンクは多くのユーザーに接続でき、多くのユーザーはリンクで接続できます。そのため、time_linked など、リンクに接続しているユーザーに関係する属性が潜在的に含まれている可能性があります。

于 2010-02-27T22:54:37.890 に答える