2011-03-12 179 views
0

我有關於像Id,Name,Date,WorkerId,VehicleId(以及更多50個字段)任務的數據表。避免表格的重複

我想建立訂單模塊,將允許用戶插入任務作爲訂單。 訂單包含來自任務的子集字段,例如WorkerId和VehicleId(正如我所說 - 任務表中有超過50個字段)。 由於每個用戶都可以選擇組成訂單的字段定義 - 我必須複製任務表並將其命名爲訂單表。 因爲任務表的巨大尺寸(在字段方面),我想避免重複它。有沒有任何可能的方式來存儲訂單數據,不包括創建巨大的表像任務表?

P.S.我不想將訂單存儲在任務表中,因爲: 1.將會有許多可能影響性能的訂單。 2.已經有很多很多的任務。

回答

0

從描述中很難確定,但聽起來好像您想將表「任務」中的列作爲訂單的訂單項對待。

ord_num line_item task_attribute attribute_value 
-- 
15  1   WorkerId   35 
15  2   VehicleId   101-345-2A3574 

話雖如此,但是,我不得不說,

  • 這個概念的意思給我,讓用戶 優先任務,但
  • 它沒有任何意義,我讓 用戶訂購 任務表中的一列或兩列。

特別是對於只是爲了一個或兩個ID號從任務表 - 跆拳道這是否意味着啊?

+0

這是一個非常重複的系統,有很多連接,我試圖讓事情變得非常簡單,所以它聽起來像是不合邏輯的。但相信我 - 是的。你的解決方案的問題是我不能使用外鍵,我認爲這是一個巨大的負面影響。 – Naor 2011-03-12 19:05:37

+0

@Naor:如果您必須將外鍵設置爲「任務」表,您不能讓用戶選擇列,可以嗎?外鍵必須引用具有唯一約束的主鍵或列或一組列。 – 2011-03-12 19:21:00

1

您可以將字段is_order添加到您的任務表中,並將其設置爲true(如果它的順序)或false(如果它的任務)。

您可能還想重命名您的表以顯示它可以包含訂單或任務。

+0

我更新了我的問題 - 我不想合併任務和訂單。 – Naor 2011-03-12 18:33:19

+0

@Naor:爲了提高性能,你可以添加一個索引。 – 2011-03-12 18:39:58

+0

我有很多原因爲什麼不這樣做,我可以寫很多故事,浪費很多時間。我不想登上桌子 - 請儘量幫我解決我的限制。 – Naor 2011-03-12 19:02:37

1

如果我理解正確,你想創建一個新表,但你不希望它有50列。是對的嗎?

你可以做一些像Orders(ID, Configuration)其中配置是所有可選數據的字符串表示。或者你可以做一些像Orders(ID, FieldID, FieldValue)。在這種情況下,如果訂單有三個可選字段,它將在表中顯示爲3個不同的行。當你想查詢它們時,這兩種方法都會帶來挑戰。我想我會咬緊牙關,只有50列的桌子。

+0

請參閱我給Catcall的回答添加的評論,與您的回覆類似。 – Naor 2011-03-12 19:06:34

+0

如果FK很重要,那麼我認爲你需要更多的50列表。 – joelt 2011-03-12 20:11:11

1

如果您在任務中有50個字段,那麼這個表是未標準化的。如果它是「非常重複的系統」,則數據庫不是標準化的。正如您似乎意識到的那樣,非標準化表格很難擴展,它們對功能擴展設置了嚴格的限制。

在添加訂單並將它們與任務或任務組件關聯起來,從而複製重複之前,您需要先對任務進行標準化。這將導致任務涉及到的幾個規範化表(Person,Vehicle,Worker),然後添加Order並將Order與這些表關聯起來會很簡單。

+0

我的桌子已經正常化了,我已經有工人,車輛等等桌子了。 – Naor 2011-03-13 09:28:41

+1

@Naor。太棒了。在這種情況下,發佈與任務相關的所有表的DDL(包括索引)。我們可以將Order與適當的表相關聯,而不是Task。 – PerformanceDBA 2011-03-13 10:56:01