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

问题描述

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

这可以确保每个选民可以在一个类别中进行投票。