让我们说我们必须让人们投票,可以是来自用户或来宾:
CREATE TABLE votes (
to_user_id INT UNSIGNED NOT NULL,
from_user_id INT UNSIGNED,
from_ip_address INT UNSIGNED
)
对于用户投票,我们要应用唯一约束(to_user_id, from_user_id)
,并为来宾约束(to_user_id, from_ip_address)
。
没有同时应用的唯一索引的组合,这些索引不会破坏任何这些:投票的唯一性和具有相同IP地址的不同用户投票的能力。
有什么好的解决方案吗?
答案 0 :(得分:0)
您可以更改数据结构:
CREATE TABLE Votes (
VoteId int unsigned primary key,
UserId int unsigned not null,
IpAddress int unisgned,
Which enum('from', 'to'),
constraint unq_Votes_UserId_IpAddress_Which unique (UserId, IpAddress, Which)
);
请注意,我添加了一个主键,这对于外键引用非常方便,可以识别单个行,并维护插入的顺序。
答案 1 :(得分:0)
最终我找到了一个可以接受的解决方案:
CREATE TABLE votes (
vote_id INT UNSIGNED AUTO_INCREMENT,
to_user_id INT UNSIGNED NOT NULL,
from_user_id INT UNSIGNED,
from_user_ip INT UNSIGNED,
from_guest_ip INT UNSIGNED,
PRIMARY KEY (vote_id),
UNIQUE INDEX (to_user_id, from_user_id),
UNIQUE INDEX (to_user_id, from_guest_ip)
);
INSERT INTO votes (to_user_id, from_user_id, from_user_ip) VALUES (1, 2, 255), (1, 3, 255);
INSERT INTO votes (to_user_id, from_guest_ip) VALUES (1, 255);