2013-12-10 52 views
1

我有一個表單有很多問題。我在一些字段中保存以逗號分隔的數據,之後我無法搜索它們。然後,在搜索網絡並找到很多解決方案之後,我決定分開一些表格。使用多個表格在MySQL中存儲數據的更有效方式

我有一張桌子,成了5張桌子。

第一張桌子叫做agendamentos_diarios,這是我要存儲時間表的表格。

第二張桌子被稱爲tecnicos,我存儲技術人員的名字。兩個字段,id(主鍵)和名稱(varchar)。

第三個表格叫做agendamento_tecnico。這是表(鏈接)我是goona存儲第一個和第二個表的ID。那是因爲有一些時間表會由一個或多個技術人員出席。

四表被稱爲veiculos(車輛)。車輛的編號和名稱(兩個字段)。

Fith表是第一個和車輛表之間的鏈接。一樣。我要存儲時間表ID和車輛ID。

我有一張可以解釋得比我想說的更好的圖片。

Diagram

上午我做正確嗎?有沒有更好的將數據存儲到MySQL的方法?

+2

這不是很多表格;-)。你研究過基本的規範化規則嗎?請參閱http://www.dreamincode.net/forums/topic/179103-relational-database-design-normalization/瞭解簡介。只要繼續挖掘。 – Teson

+3

是的 - 雖然鏈接表中的id列可能是多餘的。 – Strawberry

+1

我建議重新命名該問題; 5個表格不是很多 - 這有點讓人誤解 - 如何將數據傳播到某些表格,或者如此? – halfbit

回答

3

我同意關於IDS @Strawberry,但通常是這樣做的Hibernate映射類型。如果你沒有使用Hibernate來設計你的表格,你應該將這個ID從agendamento_tecnico和agendamento_veiculos中取出。這樣你就保證了這個單一性。如果你不想這樣做,在桌子上的FK字段上創建一個唯一的鍵。

我注意到您將車輛表與技術人員分開。在你的模型上,同一輛車可以同時在兩個不同的時間表(這是沒有意義的)。如果車輛連接到會議議題_天極表上,那麼這將會變得更好。

展望你的表,我注意到(我是巴西人),你有一個名爲「servico」列其中,是指服務。您的日程安排表僅適用於一項服務。在同一個時間表上,你有多個服務?爲了解決這個問題,你可以創建一個表格服務,並與時間表建立一個m-n關係。創建一些報告並將數據庫中的服務分開很容易。

還有一個nome_cliente字段,意味着該計劃的客戶端。如果您有一個客戶(客戶)表,並將該時間表與FK關聯起來會更好。

如前所述,沒有正確的答案。你必須考慮你的問題和可能的增長。正確建模數據庫可以避免以後很多頭痛。

+2

哦,理解語言,有助於我監督車輛和時間表之間的這個(可能)錯誤的N:M – halfbit

2

更好是主觀的,沒有正確的答案。

我的自然本能會打破計劃表做得更大更強。 看起來像技術員和客戶端的數據是重複的。

有一次你可能已經做出了決定,爲完全有效的理由去正常化。

懷疑你會在這裏找到任何人誰跟你沒有逗號分隔的領域,雖然不同意。

你呼叫停止的地方取決於你現在的情況。逗號分隔的字段導致了你的問題,你擺脫了它們。那麼,你現在的位置是什麼引起了你的問題呢?

1

看起來不錯,特別是如果第一次嘗試

一個評論:會說出PK/FK(IDS)一樣在所有的表,而不是使用「身份證」作爲名稱(additionaly我們使用「#」或'_'作爲主鍵/ foreighn鍵的結尾字符:示例technicos.technico_agendamento_tecnico的字段爲agend_tech_technico_但這不是常識,它使查詢更加複雜(因爲您必須完全限定字段),但要使數據庫架構mor可讀(你知道在這時候PK屬於什麼FK)

其他評論:兩個assotiativ e(我從來沒有寫過那個單詞!)表,加入technosagendamento_tecnico有一個自己的ID字段,但他們不需要這樣做,因爲他們加入的兩個表中的兩個(主鍵/唯一鍵)所以你可以使用它們作爲這張表的PK:

CREATE TABLE agendamento_tecnico (
    technico_ int not null, 
    agend_tech_ int not null, 
    primary key(technico_,agend_tech_) 
) 
+1

不知道是否需要連接中的id鍵,但它們肯定不會被使用。 –

相關問題