2016-07-14 37 views
0

我正在創建一個數據庫在一個小應用程序的MySQL。 問題是有太多的字段是相同的不同的表等什麼更好?多個表具有相同的實體與幾個關係表有更多的記錄

表1:Muncipal問題: ID, 用戶ID, 標題, 位置, 說明, IMAGEURL,

表2: Harrasement問題: ID,用戶名 , 標題, 位置, 說明, IMAGEURL

和表3與上述相同

兩個表具有幾乎相同coulmns。 我想問一下,如果最好使用一個關係並創建一個表來處理ID並將其與其他細節鏈接起來,或者最好創建一個單獨的表,併爲這些問題添加額外的庫。

一方面就會有太多的表具有相同的列。另一方面,另一方面 會有很多表中有太多行的表。

將是最適合表現更多的行或多個表什麼。

我使用MySQL的。

回答

1

首先,除非你希望以百萬計的記錄不很在乎性能,但更在乎你的數據的結構和多麼容易將訪問它。從字面上寫下您打算在應用中提取的數據列表,例如「今天查找所有問題」,「查找6個月以上的所有未解決的問題」,然後嘗試根據您的預期結構構建真正的SQL查詢。如果他們正在努力嘗試改變結構。

要回答你的問題:這取決於。目前的結構具有以下優點:

  • 可以很容易地查詢某一類型的問題
  • 可以很容易地建立一個PHP應用程序 - 只是做一個模板形式(或模式),然後用其他的細微變化copypaste它表
  • 如果出現性能問題,可以通過簡單地將每個表放在不同的數據庫服務器上來創建羣集。

及以下缺點:

  • 這是不靈活。添加忘記添加的新字段會很痛苦,因爲您必須更改3個(或更多)表格,然後在應用中更改相同數量的表格。
  • 添加新類型的問題將是痛苦的,需要創建新表。
  • 創建用於獲取「所有未解決問題(不論類型)」數據的SQL-s將需要複雜的UNION -s。此外,這個UNIONS將需要創建具有問題類型的虛擬字段,否則您無法從哪個表中確定某個ID是否到達。

傳統的數據庫方法建議使用一個表作爲常用字段,併爲不同的字段創建派生表。所以:

  • issues表應具有的所有公共字段和被PK鑑定issue_id
  • municipal_issues使用外鍵issues.issue_id而僅具備特定領域
  • harassment_issues使用外鍵issues.issue_id並且只有具體字段
  • issues表具有issue_type字段,其​​值爲「騷擾」,「市政」等,並幫助找到附加數據存儲的表。

此模式被稱爲「Class Table inheritance」,您可以查看SQL antipatterns演示文稿獲取更多信息和其他方法。這解決了靈活性問題,並且仍然允許只用一個簡單的JOIN快速創建每個原始表。

另外,作爲一個附註,你可以看看像Mantis這樣的bug跟蹤器的數據庫模式,因爲這看起來像是同一個域。

相關問題