私は SQL の初心者で、プログラミングをしながらできるだけ多くのことを学ぼうと頭を悩ませています。私がそれを正しく行うことを確認したい。多対多ブリッジ テーブルの基本を学びましたが、2 つのフィールドが同じ型の場合はどうなるでしょうか。何千人ものユーザーがいるソーシャル ネットワークを考えてみましょう。誰が誰と友達であるかを追跡するためのテーブルをどのように作成しますか? それぞれの関係について追加のデータがある場合はどうなるでしょうか。たとえば、「友達になった日」などです。「dateY と dateZ の間にフレンドになった userX のすべてのフレンドを表示する」などのクエリがあることを知っています。私のデータベースにはこのような状況がいくつかあり、それを行う効率的な方法がわかりません。たくさん出てくるので、
66812 次
4 に答える
4
次のように、単一のリンク テーブルで十分です。
People( PersonId bigint, Name nvarchar, etc )
Friends( FromPersonId bigint, ToPersonId bigint, DateAdded datetime )
クエリの例:
私と友達は誰ですか?(つまり、私を友達として追加したが、必ずしも往復したわけではない人)
SELECT
People.Name
FROM
Friends
INNER JOIN People ON Friends.FromPersonId = People.PersonId
WHERE
Friends.ToPersonId = @myPersonId
2 つの日付の間に私を追加したのは誰ですか?
SELECT
People.Name
FROM
Friends
INNER JOIN People ON Friends.FromPersonId = People.PersonId
WHERE
Friends.ToPersonId = @myPersonId
AND
Friends.DateAdded >= @startDate
AND
Friends.DateAdded <= @endDate
于 2013-09-04T00:14:21.977 に答える
2
2 人のユーザーの ID を関係テーブルの PRIMARY KEY として使用する必要があります (関係は双方向でなくても一意になります)。そんな感じ
CREATE TABLE
Users
(id
int(9) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id
) );CREATE TABLE
Relationships
(id1
int(9) NOT NULL,id2
int(9) NOT NULL,friended
タイムスタンプ NOT NULL, 主キー (id1
,id2
) );
ご注意ください:
- id1 と id2 は Users テーブルを参照します (上記のコードは非常に単純化されています)
- 関係が「双方向」でなくても、id1 - id2 がある場合、id1 ユーザーが id2 ユーザーを友達として追加しているように見えますが、必ずしもその逆ではないように見えると考えることができます - THEN id2 ユーザーは id1 ユーザーを友達として追加できます -次の可能な組み合わせを持つことができる関係の表:
- id1-id2, (1人だけ2人を友達に追加)
- id2-id1, (only2 1人を友達追加)
- id1-id2 AND id2-id1 (両方 - 関係テーブルの 2 行を意味し、両方とも相互の友達です)
于 2015-12-20T05:36:39.760 に答える