0

MySQLの最適化について、インターネットでさまざまなことを読みました。

友達についてのテーブルがあります。そして、私は2種類の友達を区別します:プロの友達と「ソーシャル」(プロではない)友達です。

私の質問は:

私には1000万行以上(500万人のプロフェッショナルと500万人のソーシャル)の友達がいるとしましょう。それらすべてを3列のテーブルに入れる方が良いですか

-idFriend1、-idFriend2、-isProfessional

または、2つの列(および行数の半分のみ)を持つ2つのテーブル(専門家と非専門家の友人)を持つ方が良いですか?

ちなみに、私はこのテーブルでいくつかの結合を行う必要があるので、結合プロセスがある場合とない場合のどちらが最適ですか?

4

2 に答える 2

3

「最良」の評価は、モデルの残りの部分でこれらのエンティティをどのように使用するか、および作成するクエリの種類によって異なります。

仕事上の友人と社交上の友人が (仕事上の地位や社会的地位を除いて) 本当に同じである場合、私はテーブルを 1 つだけ作成します。仕事上の友人が、役職、一緒に働いていた場所、会社名などのいくつかの異なる属性を持っていることが判明した場合、社交的な友人 (好きな飲み物、好きなスポーツなどを持つ可能性があります) とは異なる属性がいくつかあることが判明した場合は、異なるサブセット テーブルが順番に並んでいます。

実際には、3 つのテーブルが順番に並べられていることに気付くかもしれません。FriendID とすべての共通属性 (名前、年齢、住所) をリストする friends テーブル。プロの友達テーブル (FriendID のプロの属性をリストします); ソーシャル フレンド テーブル (FriendID のソーシャル属性をリストします)。このようにして、すべての共通属性とサブセット テーブルを持つエンティティとして、検証用のスーパー セットを用意します。また、友人が社交的な友人であると同時に職業上の友人である可能性があるかどうかを柔軟に決定することもできます。

ただし、現状では、テーブルをどのように使用する予定なのか、テーブルがデータ モデルの残りの部分とどのように関連するのかについては何もわかっていないため、「最善」とは言い難いものです。

于 2013-01-01T20:31:03.320 に答える
1

私はあなたの質問を誤解していたと思います.あなたは友人が誰であるか、そして彼らの間の関係のウェブを定義する必要があることの両方を気にかけています. その場合、名前などを含む友人情報を 1 つのテーブルに入れ、それらの間のリンクを持つ別のテーブルを作成します。

CREATE TABLE FRIEND (
  id int auto_increment primary key,
  name varchar(20)
);

INSERT INTO FRIEND (name)
VALUES 
('Andrew')
('John')
('Sally')

CREATE TABLE RELATIONSHIP (
  relationshipId int auto_increment primary key,
  friendId1 int,
  friendId2 int,
  isProfessional boolean
);

INSERT INTO RELATIONSHIP (friendId1, friendId2, isProfessional)
VALUES
(1, 2, TRUE),
(1, 3, FALSE);

友情は互恵的であるため、特定の人物の友人を検索する場合は、友人 1 と友人 2 の両方で ID を検索し、ユニオン クエリを実行する必要があります。

それ以外の場合は、テーブルのサイズを2倍にしますが、私の経験では遅い結合を回避します。

于 2013-01-01T20:30:09.440 に答える