【发布时间】:2012-04-09 20:17:56
【问题描述】:
我正在重新设计一个 MySQL 数据库,其中包含一个包含大约 1,500 列的表以及其他表。我们希望通过创建第二个表来规范化该表中的数据,该表将为初始表中存在的每一列/行提供一条记录。我们称这些表为 Master 和 MasterData。 Master 将包含该表中所有记录所需的基本信息。 MasterData 将包含一些与主表中的记录有关的附加数据的值。所以假设 Master 看起来像这样:
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 中的所有数据,就好像它是 Master 中的一列一样。这可能吗?
非常感谢任何帮助!
【问题讨论】:
-
我更喜欢第二个查询而不是第一个查询(尽管不是使用隐式连接语法),尽管我不想像你正在做的那样使用 EAV 表(有很多固有问题)。不过,1500 列太多了。这些数据的范围是什么?您可能有更多的多列表,而不是到目前为止所显示的。
-
你能指定用例吗?我真的很想知道这种方法应该解决哪个问题。
-
这不是标准化的设计,你知道的。查询也不高效或容易。
-
你不应该在 21 世纪使用隐式连接。它们是一种 SQL 反模式。
-
“标准化”。我不认为它意味着你认为它的意思。