2011-09-20 49 views
0

我有一個ai_order表。RDBMS,外鍵合併還是單獨表?

CREATE TABLE `ai_order`(
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `product_id` INT(11) NOT NULL, 
    `quantity` INT(11) NOT NULL, 
    `number` VARCHAR(20) NOT NULL, 
    `addDate` DATETIME NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `orderProduct`(`product_id`,`number`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

作爲來自客戶端的順序包含了許多產物與量,這意味着被插入單個順序多行,例如一個訂單包含一個50產物被導致產生的50行中ai_order表。現在爲了確定一個單獨的訂單,我給出了一個數字字段,它將保存一個訂單的唯一訂單號(序列號),即它將number字段組成order_id。下面是演示數據將如何存儲在表格中的表格。

ai_order

會有將從該父表中可以延長許多表。而一切都是正確的我看到的問題是number列重複的價值一次又一次,考慮我有200產品列出的一個訂單,我將不得不重複number列值一次又一次在所有200行,這給了我一些難看的感覺。

現在解決這個危機的方法是將訂單number存儲在不同的表中(儘管重複不能避免,但不是問題)。例如,如何從ai_order表中刪除number列並以這種方式進行存儲。

CREATE TABLE `ai_order_number`(
    `order_id` INT(11) NOT NULL, 
    `number` VARCHAR(20) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我想你的承擔如何處理這種做法?哪一個你會去。第一個還是後一個?任何改善建議將不勝感激。

謝謝。

+0

我會堅持自己的第一選擇。這似乎對我來說是正確的,你必須在另一個例子中保留第二個表格,這看起來像是在殺死。 –

+0

這確實有道理:) –

+0

只是另一個問題,是數字字段外鍵到另一個訂單表?這是我實現它的方式,並且表ai_order僅僅是產品和訂單之間的多對多表。 –

回答

1

我不認爲按照您的建議保留一張單獨的表是一個好主意,因爲order_number與訂單直接相關。

如果您仍然計劃保留不同的表格,請將'add_date'與數字一起取出。我發現'add_date'比訂單號碼更醜陋。

如果增加訂單的確切時間是沒有用的,這是一般的情況,你可以保持一個單獨的表,這將有customer_idorder_number(主鍵),order_date

1

我會採用第一種方法,因爲重複該表中的訂單號沒有任何問題,因此不需要創建第二個表,該訂單號無論如何都會重複訂單號。

我會做什麼,而不是,也許是變得比由id列擺脫掉id列,使number表的主鍵,因爲你更容易進行搜索,連接,等等,通過訂單號。 number列也可以自動生成,所以這不會成爲問題。

+0

數字列似乎是訂單表的外鍵,所以你的計劃似乎有缺陷。如果OP允許用戶將兩個相同的產品添加到訂單 –

+0

中,您將無法使其成爲靈魂主鍵,您將不得不使用類似(數字,product_id)甚至(數字,product_id,addDate)的內容@astander nope,一個訂單隻允許一個產品。 @伊卡洛斯你的建議在邏輯上是不正確的。因爲我有許多其他表將涉及到這個父表我需要一個'id'列來標識屬於單個訂單和數字字段的所有行,以將所有行組合在一起。 –

+0

Productid,號碼已經是唯一的。看看錶格的定義。但是,你的觀點是有效的;我只是再次閱讀這個問題,id很明顯是fk。我的觀點是,id似乎是不必要的:他將ordernumber定義爲varchar,但它似乎只存儲數字,並且它是一個連續數字或它出現。訂單號應該足以將所有使用此額外ID列的w/o錶鏈接起來,這似乎沒有提供非常有用的用途。 – Icarus