如何解决如何构建有限的投票系统设计
我有3种类型的表。 Categories
,Candidates
,Voters
。
为了尽可能简短地描述问题,Candidates
只能属于1类。 Voters
可以为每个类别投票,一个类别只能投票一个人。没有第二人可以为1个类别投票。我的意思是,如果Voter对Paul进行投票,而Paul是Paul的总统候选人,则该选民不能投票选举第二位总统候选人,而可以投票选举副总统和秘书。
因此,主要问题是为 1个选民可以投票支持3种类型的类别以及该类别内的1位候选人进行投票
这是桌子。
CREATE TABLE Categories(
Id INT PRIMARY KEY IDENTITY(1,1),Name NVARCHAR(20) NOT NULL UNIQUE,);
CREATE TABLE Candidates(
Id INT PRIMARY KEY IDENTITY(1,Name NVARCHAR(20) NOT NULL,Surname NVARCHAR(20) NOT NULL,Category_Id INT FOREIGN KEY REFERENCES Categories(Id) NOT NULL,);
CREATE TABLE Voters(
Id INT PRIMARY KEY IDENTITY(1,Age INT NOT NULL CHECK(Age>=18),);
这是我遇到问题的表
CREATE TABLE VotersCandidates(
Id INT PRIMARY KEY IDENTITY(1,Voter_Id INT FOREIGN KEY REFERENCES Voters(Id) NOT NULL,Candidate_Id INT FOREIGN KEY REFERENCES Candidates(Id) NOT NULL,);
谢谢你的帮助!
解决方法
VoterCandidates
上的主键很好。您所描述的是一个独特的约束条件:
CREATE TABLE VotersCandidates (
Id INT PRIMARY KEY IDENTITY(1,1),Voter_Id INT FOREIGN KEY REFERENCES Voters(Id) NOT NULL,Category_Id INT FOREIGN KEY REFERENCES Categories(Id) NOT NULL,Candidate_Id INT FOREIGN KEY REFERENCES Candidates(Id) NOT NULL,CONSTRAINT unq_VotersCandidates_Voter_Category UNIQUE (Voter_Id,Category_Id)
);
现在,您还有另一个问题。 。 。该表中的类别可能与候选表中的类别不一致。要解决此问题,请使用另一个唯一约束和外键引用:
CREATE TABLE Candidates (
Id INT PRIMARY KEY IDENTITY(1,Name NVARCHAR(20) NOT NULL,Surname NVARCHAR(20) NOT NULL,CONSTRAINT unq_Candidates_Candidate_Category UNIQUE (Category_Id,id)
);
然后将其用于投票表中的外键关系:
CREATE TABLE VotersCandidates (
Id INT PRIMARY KEY IDENTITY(1,Candidate_Id INT NOT NULL,CONSTRAINT fk_voterscandidates_candidates FOREIGN KEY (Category_Id,Candidate_Id) REFERENCES Candidates (Category_Id,Id)
CONSTRAINT unq_VotersCandidates_Voter_Category UNIQUE (Voter_Id,Category_Id)
);
最后一条评论。我建议在表后命名主键。因此,它将是candidates.id
而不是candidates.candidate_id
。这样,外键关系通常位于具有相同名称的列上,这是一种自我说明。
您可以摆脱VotersCandidates表上现有的主键。相反,请实现此主键:
ALTER TABLE VotersCandidates
ADD CONSTRAINT PK_VotCat PRIMARY KEY (Voter_Id,Category_Id);
这可以确保每个选民可以在一个类别中进行投票。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。