행 수를 두 배로 늘리지 않고 우정에 대한 색인을 정의해야 할 수도 있습니다.
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 Query Optimizer는 인덱스 범위 스캔 만 수행하므로 인덱스 커버링 개념이 여기에서 잘 작동합니다.
취재 지수에 대한 멋진 링크는 다음과 같습니다.
경고
우정이 서로 다르면 다른 유형의 관계에 대한 근거가 있습니다. 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');
관계 테이블에서 다음을 포함하도록 관계를 정렬 할 수 있습니다.
- 친구는 서로 있어야합니다
- 적들은 서로의 관계 일 수도 있고 아닐 수도 있습니다
- 추종자는 서로 또는 아닌
- 다른 관계는 (잊혀지거나 잊혀진 사람 또는 복수의 수령인 (고정 된) 사람에 의해) 해석 될 수 있습니다.
- 가능성 관계를 더 확장 할 수 있습니다
관계가 상호 관계에 관계없이 모든 관계에 대해보다 강력해야합니다.