2017-03-01 67 views
0

我堅持節日包清單項目,它包含一個主表packages用於存儲包信息的數據庫設計。MySQL的列JSON VS加入

這裏是場

  1. ID PK
  2. 程序包VARCHAR
  3. 景點JSON如場: '超級', '搞笑'],
  4. 夾雜JSON如字段: '你好','酷']

一個包可能有很多景點和包含所以這就是爲什麼我選擇一個json字段。

因此,這是一個誹謗的方式或保持景點和夾雜物與外鍵關係??另一個表。

如果讓我選擇第二種方法(即,景點和夾雜物不同的表)有關搜索特別的吸引力包什麼想搜索需要一個連接查詢(與加入搜索是一個不好的做法?)。

但在第一種方法,我們可以申請一個JSON搜索(MySQL的版本> 5.7支持JSON搜索)。

回答

1

這取決於你如何複雜預見該項目成爲。您可以使用現有的表配置並利用JSON搜索功能,但是隨着您的表格變大,這將成爲性能越來越大的問題。 最好創建4個表格,包裹,包含物,景點和關係。

軟件包

  • ID(int)的PK
  • 名稱(VARCHAR)

景點

  • ID(int)的PK
  • 名稱(VARCHAR)

夾雜

  • ID(int)的PK
  • 名稱(VARCHAR)

關係

  • ID(int)的PK
  • PID(INT)FK - 包夾雜物的
  • RID(INT)ID或景點
  • 類型(VARCHAR)表示夾雜或景點

然後,你可以做連接選擇,並涉及其中任意數量的海誓山盟的類型的任意組合。

SELECT * FROM Packages p join Relation r ON p.ID = r.PID AND r.type = "Attraction" Left Join Attractions a ON a.ID = r.RID WHERE p.id = 1 /*specific package id*/ 
+0

'作爲你的表變得更大,這將是performance'您對此進行了詳細 – Jabaa

+0

在您的例子可以,爲什麼需要一個'Relations'表越來越大的問題? – Jabaa

+1

從其他問題來看,它表明連接仍然比尋找維護關係的json更高效。 [mysql-performance-json-vs-joins](http://stackoverflow.com/questions/32781427/mysql-performance-json-vs-joins) 我認爲json搜索意在更多地用於替換blob json數據使其可查詢和可聯接,而不是維護對象關係的替代品。 關係表只是使對象關係集中存儲,並防止需要解析包中的多值字段。 – M31