我正在重新設計一個包含大約1,500列的表的MySQL數據庫以及其他表。我們希望通過創建第二個表來對這個表中的數據進行規範化處理,第二個表對於初始表中存在的每一列/行都有一個記錄。我們稱這些表爲Master和MasterData。 Master將包含該表中所有記錄所需的基本信息。 MasterData將包含與主表中的記錄有關的一些附加數據的值。所以我們可以說法師會是這樣的:如何正確查詢規範化數據庫
MasterID Property1 Property2
1 Yes No
2 No Yes
3 Yes Yes
4 No No
比方說MasterData看起來就像這樣:
MasterID Property Value
1 Property3 Yes
1 Property4 No
3 Property3 No
4 Property7 Yes
隨着我這麼遠嗎?如何查詢這些數據,並且每匹配主行只有一行返回,並且包含所有相關的MasterData信息。我搜索並找到了一些例子,但是他們花了很長時間來執行我們的數據。我已經根據前面提到的一個巨大表格中的現有數據創建了一個測試MasterData表。這導致MasterData擁有大約450萬條記錄,並且以下查詢執行和超時時間過長。
SELECT Property1, Property2, Master.MasterID,
GROUP_CONCAT(case when Property = "Property3" then Value end) as Property3,
GROUP_CONCAT(case when Property = "Property7" then Value end) as Property7
FROM Master LEFT JOIN MasterData USING (MasterID) GROUP BY MasterID
HAVING Property3='Yes' OR Property7='Yes';
或
Select * FROM Master AS M, MasterData AS MD1, MasterData AS MD2
WHERE M.MasterID=MD1.MasterID AND MD1.Property='Property3' AND MD1.Value='Yes'
AND M.MasterID=MD2.MasterID AND MD2.VAR='Property7' AND MD2.Value='Yes';
同樣,我們的目標是能夠獲取所有數據MasterData在一排,好像它是在主柱。這可能嗎?
任何幫助非常感謝!
我寧願第一個查詢(儘管不是隱式連接語法),儘管我寧願不使用EAV表就像你在做什麼(有一些固有的問題)。雖然1500列是太多了。這些數據的範圍是什麼?你可能有更多的多列表,而不是迄今爲止顯示的內容。 – 2012-04-09 20:23:14
你能指定用例嗎?我真的很想知道這種方法應該解決哪個問題。 – PepperBob 2012-04-09 20:33:12
這不是標準化設計,只是你知道的。查詢效率也不高,也不容易。 – HLGEM 2012-04-09 20:47:10