如何构建有限投票系统设计
How to structure limited voting system design
我有 3 种类型的 table。 Categories
、Candidates
、Voters
。
为了尽可能简短地描述问题,Candidates
只能属于 1 个类别。 Voters
可以为每个类别投票,并且只能为一个类别中的一个人投票。不能有第二个人为 1 个类别投票。我的意思是,如果选民投票给保罗,保罗是总统候选人,同一选民不能投票给第二位总统候选人,但可以投票给副总统和秘书。
因此,主要问题是为 1 选民创建一个结构,可以投票给 3 种类别,并且只能投票给该类别中的 1 名候选人
这是 tables。
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,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,1),
Name NVARCHAR(20) NOT NULL,
Surname NVARCHAR(20) NOT NULL,
Age INT NOT NULL CHECK(Age>=18),
);
这是我在
上遇到的问题table
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,
);
谢谢您的帮助!
您可以删除 VotersCandidates table 上现有的主键。相反,实现这个主键:
ALTER TABLE VotersCandidates
ADD CONSTRAINT PK_VotCat PRIMARY KEY (Voter_Id,Category_Id);
这样可以确保每个选民只能在一个类别中投票。
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)
);
现在,您有另一个问题。 . .此table中的类别可能与候选table中的类别不一致。要解决这个问题,请使用另一个唯一约束和外键引用:
CREATE TABLE Candidates (
Id INT PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(20) NOT NULL,
Surname NVARCHAR(20) NOT NULL,
Category_Id INT FOREIGN KEY REFERENCES Categories(Id) NOT NULL,
CONSTRAINT unq_Candidates_Candidate_Category UNIQUE (Category_Id, id)
);
然后将这个用于投票中的外键关系 table:
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 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)
);
还有最后一条评论。我建议在 table 之后命名主键。因此,不是 candidates.id
,而是 candidates.candidate_id
。这样,外键关系通常位于具有相同名称的列上——一种 self-documentation.
的形式
我有 3 种类型的 table。 Categories
、Candidates
、Voters
。
为了尽可能简短地描述问题,Candidates
只能属于 1 个类别。 Voters
可以为每个类别投票,并且只能为一个类别中的一个人投票。不能有第二个人为 1 个类别投票。我的意思是,如果选民投票给保罗,保罗是总统候选人,同一选民不能投票给第二位总统候选人,但可以投票给副总统和秘书。
因此,主要问题是为 1 选民创建一个结构,可以投票给 3 种类别,并且只能投票给该类别中的 1 名候选人
这是 tables。
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,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,1),
Name NVARCHAR(20) NOT NULL,
Surname NVARCHAR(20) NOT NULL,
Age INT NOT NULL CHECK(Age>=18),
);
这是我在
上遇到的问题tableCREATE 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,
);
谢谢您的帮助!
您可以删除 VotersCandidates table 上现有的主键。相反,实现这个主键:
ALTER TABLE VotersCandidates
ADD CONSTRAINT PK_VotCat PRIMARY KEY (Voter_Id,Category_Id);
这样可以确保每个选民只能在一个类别中投票。
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)
);
现在,您有另一个问题。 . .此table中的类别可能与候选table中的类别不一致。要解决这个问题,请使用另一个唯一约束和外键引用:
CREATE TABLE Candidates (
Id INT PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(20) NOT NULL,
Surname NVARCHAR(20) NOT NULL,
Category_Id INT FOREIGN KEY REFERENCES Categories(Id) NOT NULL,
CONSTRAINT unq_Candidates_Candidate_Category UNIQUE (Category_Id, id)
);
然后将这个用于投票中的外键关系 table:
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 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)
);
还有最后一条评论。我建议在 table 之后命名主键。因此,不是 candidates.id
,而是 candidates.candidate_id
。这样,外键关系通常位于具有相同名称的列上——一种 self-documentation.