คุณอาจต้องกำหนดดัชนีรอบ ๆ มิตรภาพแทนการเพิ่มจำนวนแถวเป็นสองเท่า:
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)
);
ด้วยวิธีนี้คุณจะเพิ่มที่เก็บข้อมูลสำหรับดัชนีเป็นสองเท่า แต่ไม่ใช่สำหรับข้อมูลตาราง ดังนั้นจึงควรประหยัด 25% สำหรับพื้นที่ใช้งาน เครื่องมือเพิ่มประสิทธิภาพการสืบค้น MySQL จะเลือกทำการสแกนช่วงดัชนีเท่านั้นซึ่งเป็นสาเหตุที่แนวคิดของการครอบคลุมดัชนีทำงานได้ดีที่นี่
นี่คือลิงค์ที่ดีบางส่วนในดัชนีการครอบคลุม:
ข้อแม้
หากมิตรภาพไม่ได้เป็นแบบร่วมกันคุณมีพื้นฐานสำหรับความสัมพันธ์ประเภทอื่น: FOLLOWER
หาก friend_to ไม่ใช่เพื่อนของ friend_of คุณสามารถออกจากความสัมพันธ์นั้นจากตารางได้
หากคุณต้องการกำหนดความสัมพันธ์สำหรับทุกประเภทไม่ว่าจะเป็นความสัมพันธ์ร่วมกันหรือไม่คุณอาจจะใช้เค้าโครงตารางต่อไปนี้:
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');
จากตารางความสัมพันธ์คุณสามารถจัดเรียงความสัมพันธ์เพื่อรวมสิ่งต่อไปนี้:
- เพื่อนควรอยู่ด้วยกัน
- อาจเป็นศัตรูกันหรือไม่
- ผู้ติดตามอาจเป็นผู้ร่วมกันหรือไม่
- ความสัมพันธ์อื่น ๆ จะถูกตีความ (โดยลืมหรือถูกทอดทิ้งหรือผู้รับการแก้แค้น (แก้ไข))
- ความสัมพันธ์ Possibie สามารถขยายเพิ่มเติมได้
สิ่งนี้ควรมีความแข็งแกร่งสำหรับความสัมพันธ์ทั้งหมดไม่ว่าจะเป็นความสัมพันธ์ซึ่งกันและกันหรือไม่ก็ตาม