0

私は単純な twitter サイト (研究用) を設計していますが、少し異なります: ユーザーは他のユーザー、キーワード、およびリストをフォローできます。以下に関する情報を入力するための次のテーブルを作成する方法を知りたいです。

このアプローチ(以下)は正しいですか?

次の表:

id ( id of the following table )
type ( type can be 1 ( user ), 2 ( keyword ) or 3 ( list ) )
idtype ( id of the type table )
user ( user's id )

ただし、キーワード テーブルはありません。だから私は知りません。

最善のアプローチは何ですか?

4

1 に答える 1

1

idtype「親テーブル」はに応じて変化するため、親テーブルへの外部キーを作成できないため、これは正しくありませんtype。ところで、ユーザーが複数のキーワードをたどることができる場合は、そのための個別のテーブルを持つことを免れることはできません(同じフィールドに複数の値を「パック」して、1NFを壊したい場合を除きます。これは、非常に悪い考えです)。

これを解決するにはいくつかの方法があります。おそらく最も簡単な方法idは、可能な親テーブルごとに個別のフィールドを使用し、それらの1つだけがNULL以外になるように制約することです。

ただしInnoDBテーブルはクラスター化されており、クラスター化されたテーブルのセカンダリインデックスは高価であるため、次のようなものを使用します(ツイートテーブルは表示されていません)。

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

これにより、「特定のユーザー(またはキーワードまたはリスト)をフォローしているユーザー」というクエリに非常に効率的に答えることができます。「特定のユーザーがフォローしているユーザー(またはキーワードまたはリスト)」と答える必要がある場合は、上記のPKのフィールドの順序を逆にします。両方が必要な場合は、両方向のインデックスが必要になります(そしてクラスタリングの価格を支払います)。

于 2012-05-15T18:31:56.813 に答える