基于概念架构编写sql脚本

时间:2014-01-26 12:03:00

标签: sql sqlite

我有以下要求

雇主可以使用他们的用户名和密码登录系统并创建工作机会。 申请人可以使用他们的用户名和密码登录系统,以查看工作机会。

  • employer的属性为employer_id,name,role
  • applicant的属性为applicant_id,DOB,Name
  • jobOpportunity的属性为JobId,Title,Description

这是我提出的图表。

ERD

将图表转换为sql脚本:

http://pastebin.com/wUnU5NMT

我不确定我是在编写脚本并根据要求正确绘制图表。

2 个答案:

答案 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) 看起来这个要求正在推动你走向登录,雇主和申请人之间的继承模式。如果这样做,那么将切换外键,以便employerapplicant 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作为外键添加到雇主和申请人表中。