高级EAV,其值包含子属性

时间:2012-01-07 21:44:41

标签: database-design relational-database entity-attribute-value

Entity-Attribute-Value数据库表是保存自定义对象属性的灵活方法。

对于我的项目,我必须超越:我不仅需要存储固定的对象值,还需要在值随时间变化时存储值。

就像一个成长中的人的长度一样:

  • 实体:彼得
  • 属性:长度
  • 值:160-1,1-1-2010,170cm,1-1-2011

通过添加另一个名为“time”的列来解决这个问题很容易。

但这个想法是更具可扩展性,例如:

  • 实体:视频
  • 属性:标记
  • 价值:彼得在XY(100,200)0:20,在XY(200,300)0:30

所以现在这个值不仅有时间,还有坐标作为额外的子属性。我希望能够处理这些子属性。

问题是:是否有任何默认的最终可扩展的已知模型? (所以我不必重新发明轮子)

或者我应该在值中使用实体周围的包装器实体吗?

1 个答案:

答案 0 :(得分:0)

好像你说时间和坐标适用于你的eav属性的所有

在这种情况下,完美的解决方案似乎只是将timecoordinates(或x和y分别)添加到您的eav表中。

拥有eav的全部原因是当你拥有可能无限数量的属性时。但是,如果某些属性将是适用于所有其他属性的 super 属性,则没有理由不扩展该eav表。

e.g。

id | entity_id | attribute  |  value  |  time    |  coordinates
1  |  25       | tag        |  funny  | 12/12/12 | 200,300
1  |  25       | tag        |  funny  | 12/13/12 | 0,1

然后你可以这样做一个查询:

SELECT `coordinates` FROM `my_table` WHERE `entity_id` = 25 ORDER BY `time` ASC

结果将是一组坐标,然后您可以在图表上绘制或与特定实体相关的任何内容。

或者你可以这样做:

SELECT `entity_id`, GROUP_CONCAT(CONCAT(`time`,'|',`coordinates`) ORDER BY `time` ASC SEPARATOR '~') as `time_coords` FROM `my_table` WHERE `entity_id` BETWEEN 25 AND 50 ORDER BY `entity_id`

那会给你一个像这样的结果

entity_id | time_coords 25 | 12年12月12日| 200300 -12 / 13/12 | 0,1 26 | 12年12月12日| 150,99〜29分之12/ 12 | 151180 -12 / 30/12 | 60,60

然后,您可以使用PHP(或其他)通过entity_id解析结果。

E.g。 (在您返回查询结果后)

while($row = mysql_fetch_row($result)) {
  $id = $row[0];
  $time_coords = explode('~',$row[1]);
  foreach($time_coords as $time_coord) {
    $temp = explode('|',$time_coord);
    $time = $time_coord[0];
    $coord = $time_coord[1];
    // do stuff with $id, and each $time+$coord for that id
  }
}