CREATE TABLE Attributes ( id VARCHAR(40), type VARCHAR(16), data VARCHAR(2048), PRIMARY KEY(id,type) );
这是我试图运行的查询的一般格式。一般的想法是,'对象'具有唯一的id,然后像JavaScript对象那样具有键/值对。如何减少此查询中连接表的数量?
SELECT a1.id, a1.data, a2.data, a3.data, a4.data, a6.data FROM Attributes a1, Attributes a2, Attributes a3, Attributes a4, Attributes a5 LEFT JOIN Attributes a6 ON (a6.id=a5.id AND a6.type = 'Foreign Id') WHERE a1.id=a2.id AND a1.id=a3.id AND a1.id=a4.id AND a1.id=a5.id AND a1.type = 'First Name' AND a2.type = 'Middle Name' AND a3.type = 'Last Name' AND a4.type = 'Timestamp' AND a5.type = 'Count' AND a5.data = 'MY_ID'
在此查询中'Foreign Id'
是一个可选属性。问题是我得到
SELECT将检查超过MAX_JOIN_SIZE行;检查你的 WHERE并使用SET SQL_BIG_SELECTS = 1或SET MAX_JOIN_SIZE =#如果 SELECT没问题。
我意识到我可以这么说,但警告让我担心这个查询的效率非常低。有没有更好的方式来制定查询?
哈哈,真棒,谢谢! – chacham15
+1,只是在列中存储属性将是* normalization *,而不是* denormalization *。 EAV反模式甚至不是关系;它不能以任何正常形式。 –
在我的情况下,我没有选择,但为了知道更好的是不是EAV NOSQL的一般前提? – chacham15