【问题标题】:How to Manage Dynamic Relationships?如何管理动态关系?
【发布时间】:2012-09-24 16:06:01
【问题描述】:

我需要帮助创建适当的数据库结构,以便动态创建“字段”和“值”。我计划使用以下 5 个表。

  1. 特质类别
  2. 特征分组
  3. 特征值

TraitCategories包含特征的类别(即“字段”)——即头发颜色、身高等——并且可以根据需要添加/删除类别。

Groups 表包含临时/动态组标签——即亚洲、南美等。

TraitGroupingsTraitCategoriesGroups 的连接表

People 表将通过外键链接到Groups 表,因此将利用GroupsTraitCategories 表之间的关系为特征分配各种类别(字段)。

但问题是,如何将per person 值分配给特征类别/字段?

我正在考虑让TraitValues 表中的每一行都包含person_idtrait_category_id,以便TraitValues 表与PeopleTraitCategories 表之间存在关系。这种方法有意义吗?这种方法是否允许我通过People 表获取特征类别和值?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 database-design activerecord


    【解决方案1】:

    您正在描述EAV 的一种形式。

    我不确定这在 Ruby 中表示有多实用,但在您的情况下,数据库模型看起来类似于:

    (为简洁起见,省略了大多数非关键字段。)

    请注意我们如何大量使用识别关系。这就是让我们将GroupId 传播到“菱形”依赖项两侧的原因,并将其合并到底部的单个字段中,在TraitValue 中。

    这是确保一个人不能具有特征的原因,除非它也被列在该人的组中。例如,一个人只有才能拥有“头发颜色”,前提是该人的群组也具有“头发颜色”。


    顺便说一句...

    People 表将通过外键链接到 TraitGroupings - 因此将被分配各种类别(字段)的特征。

    如果People 有一个直接引用TraitGroupings 的FK,那么一个人最多可以有一个特征分组,因此最多可以有一个特征类别。从你问题的措辞来看,这似乎不是你想要的。

    【讨论】:

    • 感谢清晰详细的回答;这很有帮助。你在你的BTW 部分是正确的 我打算写Groups 不是 TraitGroupings
    • 在进一步思考您的图表后,我不清楚您为什么从TraitValue 表中引用TraitGroups 表(通过FK),而不是直接引用TraitCategory 表来自TraitValue 表。您能否进一步解释/详细说明?
    • @Ari 因为TraitValue 特定于TraitGroup 而不是TraitCategory。换句话说,您需要在组中“注册”一个特征类别,然后才能为其分配值。当然,假设我对您的要求的理解是正确的......
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多