我有以下要求
雇主可以使用他们的用户名和密码登录系统并创建工作机会。 申请人可以使用他们的用户名和密码登录系统,以查看工作机会。
employer
的属性为employer_id,name,role
applicant
的属性为applicant_id,DOB,Name
jobOpportunity
的属性为JobId,Title,Description
这是我提出的图表。
将图表转换为sql脚本:
我不确定我是在编写脚本并根据要求正确绘制图表。
答案 0 :(得分:1)
登录表的键入看起来不正确,即:
CREATE TABLE Login(
(employer_id,applicant_id) INT PRIMARY KEY NOT NULL,
-- Username + password OK
FOREIGN KEY(applicant_id) REFERENCES Applicant(applicant_id));
FOREIGN KEY(employer_id) REFERENCES Employer(employer_id));
由于登录将是雇主或申请人,因此对这两者都没有任何意义。
而是为登录创建代理键(例如LoginID INT
)
看起来这个要求正在推动你走向登录,雇主和申请人之间的继承模式。如果这样做,那么将切换外键,以便employer
和applicant
FK都登录到.LoginID。您可以为雇主和登录创建新的代理主键,也可以使用登录中的继承密钥作为这些表的主键。 (即列可以同时是主键和外键。)以下是我将如何执行此操作:
CREATE TABLE Login(
(LoginID INT PRIMARY KEY NOT NULL,
username VARCHAR(45) NOT NULL,
password VARCHAR(45) NOT NULL);
CREATE TABLE Employer(
LoginID INT PRIMARY KEY NOT NULL,
name VARCHAR(45) NOT NULL,
ROLE VARCHAR(45) NOT NULL,
FOREIGN KEY(LoginID) REFERENCES Login(LoginID));
CREATE TABLE Applicant(
LoginID INT PRIMARY KEY NOT NULL,
name VARCHAR(45) NOT NULL,
DOB VARCHAR(45) NOT NULL,
FOREIGN KEY(LoginID) REFERENCES Login(LoginID));
CREATE TABLE Job(
(jobId INT PRIMARY KEY NOT NULL,
title VARCHAR(45) NOT NULL,
description VARCHAR(45) NOT NULL,
ListedByEmployerId INT NOT NULL,
FOREIGN KEY(ListedByEmployerId) REFERENCES Employer(LoginID));
但是,此模型不会限制仅由雇主列出的作业 - 这需要在应用程序中强制执行,或者使用数据库规则,触发器等。 {{1}的外键当然这解决了这个问题。
该要求未提及允许申请人申请工作的任何内容,因此未对其进行建模。
但如果他们这样做,你需要允许许多申请人申请一份工作 - 即许多:许多联络表。
答案 1 :(得分:0)
在上述架构设计中,雇主和申请人之间的工作没有关系。
如果您想查看雇主创建的工作或申请人所申请的工作。
因此我建议您将工作ID作为外键添加到雇主和申请人表中。