如何构建有限投票系统设计

How to structure limited voting system design

我有 3 种类型的 table。 CategoriesCandidatesVoters。 为了尽可能简短地描述问题,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.

的形式