sql:在属性表

时间:2018-02-15 22:21:52

标签: mysql sql

我有一个包含以下架构的数据库:

    • ID
    • id_thing_type
  • thing_attribute
    • ID
    • 名称
    • id_thing_type
  • thing_attribute_value

    • id_thing_attribute
    • value_date
  • Thing有许多Thing_Attributes加入thing.id_thing_type = thing_attribute.id_thing_type

  • Thing_Attributes在thing_attribute.id = thing_attribute_value.id_thing_attribute上加入了一个Thing_Attribute_Value

我正在尝试编写一个查询,该查询将返回特定事物记录(具有某个name)的特定属性(具有某个id)的值。 thing.id代表一个独特的行。

换句话说,thing_attributething都有id_thing_type。这些表格需要在id_thing_type = id_thing_type上加入。考虑到这一点,因为每种类型的thing都有自己独特的thing_attributes集。任务是找到特定事物的特定属性的值。

这是我到目前为止所做的,但它会返回许多行:

SELECT t.id, tav.value_date
FROM thing_attribute_value tav
JOIN thing_attribute ta
    ON tav.id_node_attribute = ta.id
JOIN thing t
    ON ta.id_thing_type = t.id_thing_type
WHERE ta.name = 'Birth Date'
AND t.id = '123'

这是一个示例结果。如您所见,返回了许多行,所有行都具有thing的相同ID,但具有不同的日期。

123,2015-12-02
123,2014-11-02
123,2013-07-11
123,2014-03-12
etc....

1 个答案:

答案 0 :(得分:0)

所以,正如我原来答案的评论中所讨论的那样:

Thing有一个Thing_Type_Id列。 并且Thing_Attribute有一个Thing_Type_Id列。 与之有1:1的关系。

Thing_Attribute有一个Thing_Attribute_Value_Id列。 并且Thing_Attribute_Value有一个Id列。 其中有1 ::多种关系。

这是导致查询失败的原因。错误实际上在您的数据关系中,而不是查询。

让我们尝试将它拼凑在一起:

事 - 需要一个独特的身份证 - 可以包含任意数量的其他列 - 将有许多属性,但此列不在此表中

Thing_Attributes - 需要一个独特的身份证 - 需要一个东西(fk to Thing) - 需要一个Type id(fk到Thing_Attribute_Type) - 需要一个价值

Thing_Attribute_Value - 可以消失 - 用类型

的查找替换它

Thing_Attribute_Type - 需要独特的身份证 - 需要价值

使用这种关系结构,每个Thing都可以拥有许多属性 您为属性类型使用id字段,因此您不会重复字符串。 使用基于Id获取Attribute_Type值的查找。

这是对您当前关系模型的彻底改革,但是对于您当前的关系模型,您无法将给定的属性值与给定的Thing隔离,我认为这至少是构建Thing对象的目标之一。