Sıra sayısını ikiye katlamak yerine arkadaşlıkların etrafındaki dizinleri tanımlamanız gerekebilir:
CREATE TABLE person
(
person_id INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (person_id)
);
CREATE TABLE friendship
(
friend_of INT NOT NULL,
friend_to INT NOT NULL,
PRIMARY KEY (friend_of,friend_to),
UNIQUE KEY friend_to (friend_to,friend_of)
);
Bu şekilde, dizinler için depolama alanını ikiye katlarsınız, ancak tablo verileri için değil. Sonuç olarak, bu, disk alanında% 25'lik bir tasarruf olmalıdır. MySQL Query Optimizer yalnızca indeks aralığı taramalarını gerçekleştirmeyi seçecektir, bu nedenle indeks indeksleri kavramı burada iyi çalışır.
İşte Kapak Dizinleri ile ilgili bazı güzel linkler:
UYARI
Eğer arkadaşlık karşılıklı değilse, başka tür bir ilişki için temeliniz vardır: FOLLOWER
Friend_to bir friend_of arkadaşı değilse, bu ilişkiyi masanın dışında bırakabilirsiniz.
Tüm türler için ilişkileri tanımlamak istiyorsanız, karşılıklı olsun veya olmasın, muhtemelen aşağıdaki tablo düzenini kullanabilirsiniz:
CREATE TABLE person
(
person_id INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (person_id)
);
CREATE TABLE relationship
(
rel_id INT NOT NULL AUTO_INCREMENT,
person_id1 INT NOT NULL,
person_id2 INT NOT NULL,
reltype_id TINYINT,
PRIMARY KEY (rel_id),
UNIQUE KEY outer_affinity (reltype_id,person_id1,person_id2),
UNIQUE KEY inner_affinity (reltype_id,person_id2,person_id1),
KEY has_relationship_to (person1_id,reltype_id),
KEY has_relationship_by (person2_id,reltype_id)
);
CREATE TABLE relation
(
reltype_id TINYINT NOT NULL AUTO_INCREMENT,
rel_name VARCHAR(20),
PRIMARY KEY (reltype_id),
UNIQUE KEY (rel_name)
);
INSERT INTO relation (relation_name) VALUES
('friend'),('follower'),('foe'),
('forgotabout'),('forsaken'),('fixed');
İlişki tablosundan, aşağıdakileri içerecek şekilde ilişkileri düzenleyebilirsiniz:
- Arkadaşlar karşılıklı olmalı
- Düşmanlar karşılıklı olabilir veya olmayabilir
- Takipçiler karşılıklı olabilir ya da olmayabilir
- Diğer ilişkiler, değerlendirmeye tabi tutulacaktı (unutulmuş, terk edilmiş veya intikam alıcısı tarafından) (sabit)
- Olası ilişkiler daha da genişletilebilir
İlişkinin karşılıklı olup olmadığına bakılmaksızın, bu tüm ilişkiler için daha sağlam olmalıdır.