2013-02-10 23 views
1

我試圖設計創建一個應該保持跟蹤完成的作業和這些作業的文書工作狀態的應用程序。它需要以下格式的數據庫(MySQL的):簡單的數據庫設計與外鍵

5表:

  1. 工作
  2. 船員(人誰執行任務)
  3. 店(在位置進行作業)
  4. 狀態(是收到的文書工作?)
  5. 評論(通訊和筆記)

以下是表應該如何與:

  • 一個船員可以有很多的工作,一個工作不能有許多船員(一至 多)
  • 一個店可以有很多的工作,一個工作不能有許多商店 (一對多)
  • 狀態屬於作業(一對一)
  • 評論屬於作業(一對一)

約束:

  1. 工作不能沒有商店中不存在,它也離不開機組人員存在
  2. 意見和沒有工作的狀態不能存在

我的SQL:

USE ppwk; 

CREATE TABLE store (
    id INT(11) AUTO_INCREMENT PRIMARY KEY, 
    account VARCHAR(3) NOT NULL, 
    secondary_account VARCHAR(64), 
    number VARCHAR(11) NOT NULL, 
    address VARCHAR(64), 
    address2 VARCHAR(64), 
    city VARCHAR(64), 
    state VARCHAR(2), 
    zip VARCHAR(12), 
    phone VARCHAR(14) 
); 

CREATE TABLE crew (
    crew_code VARCHAR(6) PRIMARY KEY NOT NULL, 
    address VARCHAR(64), 
    address2 VARCHAR(64), 
    city VARCHAR(64), 
    state VARCHAR(2), 
    zip VARCHAR(12), 
    phone VARCHAR(14), 
    phone2 VARCHAR(14), 
    phone3 VARCHAR(14), 
    phone4 VARCHAR(14), 
    fax VARCHAR(14), 
    email VARCHAR(64) 
); 

CREATE TABLE job (
    work_order INT(6) PRIMARY KEY NOT NULL, 
    svc_date DATE NOT NULL, 
    resvc_date DATE, 
    level VARCHAR(2), 
    description TEXT, 
    store_id INT(11), 
    crew_code VARCHAR(6), 
    FOREIGN KEY (store_id) REFERENCES store(id), 
    FOREIGN KEY (crew_code) REFERENCES crew(crew_code) 
); 

CREATE TABLE status (
    work_order INT(6) PRIMARY KEY, 
    status VARCHAR(64) NOT NULL, 
    added_on DATETIME, 
    closed_on DATETIME, 
    FOREIGN KEY (work_order) REFERENCES job(work_order) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE 
); 

CREATE TABLE comment (
    id INT(11) PRIMARY KEY AUTO_INCREMENT, 
    work_order INT(6), 
    act_comment TEXT, 
    clr_comment TEXT, 
    act_last_updated DATETIME, 
    clr_last_updated DATETIME, 
    INDEX (work_order), 
    FOREIGN KEY(work_order) REFERENCES job(work_order) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE 
); 

問題1:這個sql是否完全符合我的要求?

問題2:我與外鍵略有混淆。如果我將一個外鍵添加到指向「商店」的「工作」,它是否會將「工作」轉變爲屬於「商店」的子表?或者是周圍的其他方式?

謝謝。

+0

如果工作有一個指向商店的PK外鍵,那麼每一項工作都有一個相關的商店 - 這樣你就可以像查詢「找到商店X的所有作業」,因爲你可以遍歷工作,並返回那些誰是FKs參考商店X. – Patashu 2013-02-10 23:23:08

+0

是的,帶有「外鍵」的表稱爲孩子。 「工作」將成爲父母「商店」和「工作人員」的子表格;-)。 – SparKot 2013-02-11 07:27:36

+0

你確定'狀態屬於一個工作(一對一)'和'評論屬於一個工作(一對一)'實際上是一對一的。無法成爲一份工作,只有一個評論或更多的一個文件工作。如果有多個關係,那麼您可以輕鬆管理一對多關係,因爲您已經將它們放在單獨的表中。 – 2013-07-10 06:41:28

回答

1

Model

只要存儲和船員的存在,你可以創建一個新的工作。

CREATE TABLE JOB (
IDJOB CHAR(20) NOT NULL, 
IDCREW CHAR(20) NOT NULL, 
IDSTORE CHAR(20) NOT NULL, 
PRIMARY KEY (IDJOB,IDCREW,IDSTORE)) 
TYPE = MYISAM 
ROW_FORMAT = DEFAULT; 

CREATE TABLE CREW (
IDCREW CHAR(20) NOT NULL, 
PRIMARY KEY (IDCREW)) 
TYPE = MYISAM 
ROW_FORMAT = DEFAULT; 

CREATE TABLE STORE (
IDSTORE CHAR(20) NOT NULL, 
PRIMARY KEY (IDSTORE)) 
TYPE = MYISAM 
ROW_FORMAT = DEFAULT; 

CREATE TABLE STATUS (
IDSTATUS CHAR(20) NOT NULL, 
PRIMARY KEY (IDSTATUS)) 
TYPE = MYISAM 
ROW_FORMAT = DEFAULT; 

CREATE TABLE COMMENT (
IDCOMMENT CHAR(20) NOT NULL, 
PRIMARY KEY (IDCOMMENT)) 
TYPE = MYISAM 
ROW_FORMAT = DEFAULT;