我有一个属性表:
parent_record_id
(记录属性所属),
property_type_id
(属性的名称)和
property_value
。
现在我有property_type
名为DATE
,另一名property_type
名为PRICE
。当我想搜索具有
PRICE = 50$ OR DATE = 2016-10-02
它按预期执行。然而,客户端要求能够检索具有PRICE = 50$
并且已在DATE = 2016-10-02
上销售的记录。所以从本质上讲,如果他们的两个孩子遇到
(property_type = PRICE AND property_value = 50$) OR (property_type = DATE AND property_value = 2016-10-02)
我想直接的方法是在SQL中执行该查询,然后GROUP
记录并检查属性SUM
是否= 2
。 (0)
在遍历网络空间时,我还发现杀死众所周知的龙的另一种方法是两次加入属性表(在此示例的上下文中)每次分配不同的别名,然后对这些别名执行两个查询表。 (1)结果让我很高兴。
(0)解决方案看起来很浪费,因为它会继续检查行是否满足条件,即使其中一个已被证明是假的(并且因为每个记录最多可能有20个这些属性/值对,表是会变得很大。)
更新:现在我已经考虑了更多(1)可能会有相同的缺点,并且还会检查同一行两次。
(1)怎么样?还有其他可能性来解决这个问题。另外,这些解决方案的性能如何?
(是的,我知道以这种方式对属性进行建模,特别是在表格上,无论如何都将成为一个令人头痛的问题,但是我必须使用RDBMS,并且考虑到当前的情况,这个解决方案似乎是灵活的)
答案 0 :(得分:1)
还有一些其他的可能性(例如,WHERE子句中的子查询),但是我提供的(0)是最优雅和语义正确的。
至于性能,您可以在需要时尝试调整它,而不是之前因为“过早优化是所有邪恶的根源”。 ;)