对不起,标题不能更具描述性,我仍然不知道我正在处理的名称。
我正在为一个房地产网站开发一个搜索系统,它一直运作良好,直到我意识到我忘了考虑我的一些字段(在搜索页面中用作过滤器)可能是多个值。我的意思是我只有一个销售和租赁的领域,还有一个领域以及住宅和商业(其他领域) - 问题是房产可以出售或出租或可能是住宅,商业和工业。
我以为我会做的就是将它们移到他们自己的桌子上。问题是,我还有另一个表,列出了每个字段的可能值,用于显示值名称,填充表单,用作约束等。
所以现在我被困在无数的桌子上。
属性表,然后是值表,然后是将这些值连接到属性的表。
没有过滤器的普通搜索查询(更多过滤器,更多联接)我在7个内部联接。
我很难将连接用于约束结果和返回查询的SELECT部分中的值。
我很感激任何建议,因为这个问题让我在过去2天内精神疲惫。
修改
目前我有以下表格:
属性
properties_images
properties_listings
properties_options
properties_purposes
res_geo_address
res_geo_cities
res_geo_neighborhoods
res_geo_states
res_property_options
res_property_type_age
res_property_type_listing
res_property_type_property
res_property_type_purpose
res_property_type_purpose_property
属性表是主要的属性表,有一些描述属性的列。
properties_ tables用于桥接属性表和res_property_表(使用id - 一个用于属性,一个用于值)(异常是图像,它只包含图像记录)
res_ tables列出了大部分的id和值名称。 (例外是res_geo表)
截至目前,我的查询无效。说实话,我已经达到了这样的复杂性,我很难解释我目前的设置。
如果有一种简单的方法来查询具有数组并且可以轻松检索这些数组的字段的表,我会很高兴。
编辑2:
上图显示了其中一个连接。我如何能够查询属性,总是检索与其关联的所有列表名称的concat,但可选择通过某组列表ID限制属性?
答案 0 :(得分:1)
如果这是你所描述的:
Entity
^
|
EntityPropertyValue
|
|
Property<---- PropertyValue
^ |
| |
---------------------
Property
定义了可应用于给定Entity
的各种属性,PropertyValue
定义了对给定Property
和{{1}有效的值定义给定EntityPropertyValue
的给定属性的值,那么你所拥有的几乎就是EAV(只需用Entity
代替Attribute
,你就会< / em>完全有EAV)。
这种架构没有任何本质上的错误,并且肯定有一些情况下它是有效的(可能只有 有效)选择。你的情况听起来像是EAV的一个很好的候选人。
正如您所发现的那样,问题在于它可能使查询变得困难,尤其是当您要允许用户为给定属性指定多个值时。这将使构建结果集变得困难,因为您将不得不考虑潜在的笛卡尔积。如果没有看到您遇到问题的实际查询,我无法给您任何进一步的建议(随意编辑您的问题并对我的答案发表评论;如果您这样做,我会修改它并添加一些建议),但我可以告诉你,只是拥有“无数的表”并不一定是坏事,事实上,根据你的参数,听起来就像是正确的设计选择。
答案 1 :(得分:1)
听起来你是使用整数键来处理所有事情的非常糟糕的建议的受害者,即使是只有一个真实列的简单表格,其中包含“Sale”,“Rent”等值。
你的表RES_PROPERTY_TYPE_LISTING应该只有一列“TypeCode”(当我们使用字符主键时,使用“code”是一个非常古老的约定),这是主键。
现在您可以删除一个表,因为PROPERTIES_LISTINGS看起来像这样:
ID_PROPERTY TypeCode
----------- ---------
1 Sale
1 Rent
2 Rent
至于整数加快连接的想法,我们刚刚删除了一个JOIN,最快的JOIN是你不必做的。剩下的JOIN仍然是整数,所以当你达到10,000 trx /秒时你是安全的,因为在此之前你永远不会看到差异。
祝你好运!