Anda mungkin perlu menentukan indeks di sekitar pertemanan alih-alih menggandakan jumlah baris:
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)
);
Dengan cara ini, Anda menggandakan penyimpanan untuk indeks tetapi tidak untuk data tabel. Akibatnya, ini harus menjadi penghematan 25% pada ruang disk. MySQL Query Optimizer akan memilih melakukan pemindaian rentang indeks saja, itulah sebabnya mengapa konsep yang mencakup indeks berfungsi dengan baik di sini.
Berikut ini beberapa tautan bagus di Covering Indexes:
CAVEAT
Jika persahabatan tidak saling menguntungkan, Anda memiliki dasar untuk jenis hubungan lain: FOLLOWER
Jika friend_to bukan teman friend_of, Anda bisa mengabaikan hubungan itu.
Jika Anda ingin mendefinisikan hubungan untuk semua jenis, apakah itu saling atau tidak, Anda mungkin bisa menggunakan tata letak tabel berikut:
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');
Dari tabel relasi, Anda dapat mengatur hubungan untuk menyertakan yang berikut:
- Teman harus saling menguntungkan
- Musuh bisa saling menguntungkan atau tidak
- Pengikut bisa saling atau tidak
- Hubungan lainnya akan tunduk pada interpretasi (oleh yang dilupakan atau ditinggalkan atau penerima balas dendam (tetap))
- Kemungkinan hubungan bisa diperpanjang
Ini harus lebih kuat untuk semua hubungan, apakah hubungan itu timbal balik atau tidak.