【问题标题】:MySQL multiple values in fields, EAV, etcMySQL 字段、EAV 等中的多个值
【发布时间】:2011-06-07 13:39:55
【问题描述】:

抱歉,标题无法描述性更强,我仍然不知道我正在处理的内容的名称。

我正在为一个房地产网站开发一个搜索系统,它运行良好,直到我意识到我忘记考虑我的一些字段(在搜索页面中用作过滤器)可能是多个值。我的意思是,我只有一个用于出售和出租的领域,而只有一个用于住宅和商业的领域(其他领域也是如此)——问题是房产可能是出售或出租的,也可能是住宅、商业和工业。

我想我会做的就是把它们移到他们自己的桌子上。问题是,我还有另一个表,其中列出了每个字段的可能值,用于显示值名称、填充表单、用作约束等。

所以现在我被无数张桌子困住了。

属性表,然后是值表,然后是将这些值连接到属性的表。

没有过滤器的普通搜索查询(更多过滤器,更多连接)我有 7 个内部连接。

我很难让联接在查询的 SELECT 部分中同时用于约束结果和返回值。

感谢任何建议,因为这个问题在过去 2 天让我精神疲惫。

编辑:

我目前有以下表格:

属性
属性图像
属性列表
属性选项
属性_用途
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_用途
res_property_type_purpose_property

属性表是主要的属性表,有一些描述属性的列。

properties_表用于连接properties表和res_property_表(使用ids - 一个用于属性,一个用于值)(图像除外,它只包含图像记录)

res_ 表列出了大部分的 id 和 value 名称。 (res_geo 表除外)

截至目前,我的查询不起作用。老实说,我已经达到了难以解释我目前的设置的复杂程度。

如果有一种简单的方法可以查询具有数组的字段的表并轻松检索这些表,那就太好了。

编辑 2:

上图显示了其中一个连接。我如何能够查询一个属性,始终检索与其关联的所有列表名称的连接,但可选择通过一组列表 ID 限制属性?

【问题讨论】:

  • 请描述您创建的表,特别是您的值查找的工作方式。一般来说,如果无数表正确地对您要存储的数据进行建模,则它们没有任何问题。
  • 正如我在与 EAV 相关的问题中经常做的那样:weblogs.sqlteam.com/davidm/articles/12117.aspx - 查看这篇文章并注意最后一句话。

标签: mysql database database-design schema entity-attribute-value


【解决方案1】:

如果这是你所描述的:

           Entity
             ^
             |
     EntityPropertyValue
             |
             |
Property<----      PropertyValue
   ^                     |
   |                     |
    ---------------------

其中Property 定义可应用于给定Entity 的各种属性,PropertyValue 定义对给定Property 有效的值,EntityPropertyValue 定义给定属性的值给定的Entity,那么您所拥有的几乎就是 EAV(只需将单词 Attribute 替换为 Property,您将完全拥有 EAV)。

这种架构本质上没有任何问题,而且在某些情况下它肯定是有效的(并且可能是唯一有效的)选择。您的情况听起来确实适合 EAV。

正如您所发现的,问题在于它会使查询变得困难,尤其是当您要允许用户为给定属性指定多个值时。这将使构建结果集变得困难,因为您将不得不考虑潜在的笛卡尔积。如果没有看到您遇到问题的实际查询,我无法给您任何进一步的建议(请随时编辑您的问题并对我的答案发表评论;如果您这样做,我将对其进行修改并添加一些建议),但我可以告诉你,简单地拥有“无数张桌子”并不一定是坏事,事实上,考虑到你的参数,这听起来像是正确的设计选择。

【讨论】:

    【解决方案2】:

    听起来你是一个非常糟糕的建议的受害者,即对所有内容都使用整数键,即使是只有一个实列的简单表,其值如“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/秒时你是安全的,因为在此之前你永远不会看到差异。

    祝你好运!

    【讨论】:

    • 插入yes时我还需要第三个表来确保完整性吗?
    • 是的,但仅适用于 RI。查询时忽略它。您也可以为州执行此操作,也许其他一两个,应该会大大简化事情。
    猜你喜欢
    • 2015-08-17
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多