Theo nhận xét của bạn,
Đối với trường hợp sử dụng của tôi, user_one_id đại diện cho người khởi xướng tình bạn và user_two_id đại diện cho người nhận tình bạn. Vì vậy, tôi không thể chỉ sử dụng giá trị thấp nhất là user_one_id.
Vâng, bạn vẫn có thể làm điều đó. Trường hợp sử dụng của bạn chỉ loại trừ ràng buộc hàng để đảm bảo điều đó. Những gì bạn muốn là sử dụng một ràng buộc bảng, một cái gì đó như thế này.
CREATE TABLE friendship (
user_one_id int NOT NULL,
user_two_id int NOT NULL,
CHECK (user_one_id != user_two_id ),
PRIMARY KEY (user_one_id, user_two_id)
);
-- you can do least first if you want. doesn't matter.
CREATE UNIQUE INDEX ON friendship (
greatest(user_one_id, user_two_id),
least(user_one_id, user_two_id)
);
Chúng tôi có rất nhiều thứ đang diễn ra ở đây .. Chúng tôi đảm bảo.
- Cả hai đều
NOT NULL
- Cả hai không bằng nhau
- Cả hai đều
UNIQUE (user_one_id, user_two_id)
Điều đó để lại một vấn đề còn tồn tại về tính duy nhất giao hoán, chúng tôi giải quyết vấn đề đó bằng một ràng buộc bảng duy nhất tùy chỉnh được thực hiện với một chỉ mục.
Bằng chứng trong bánh pudding
INSERT INTO friendship VALUES ( 1,2 );
INSERT 0 1
test=# INSERT INTO friendship VALUES ( 2,1 );
ERROR: duplicate key value violates unique constraint friendship_greatest_least_idx"
DETAIL: Key ((GREATEST(user_one_id, user_two_id)), (LEAST(user_one_id, user_two_id)))=(2, 1) already exists.
Như một lưu ý thân thiện quan trọng, tên của bạn là tất cả các loại ngớ ngẩn. Các mối quan hệ là tốt. Trong sản xuất, xin vui lòng cho họ tên tốt hơn ..
friendship
----------
request_initiator
request_target
other_fields