Entity-Attribute-Value数据库表是保存自定义对象属性的灵活方法。
对于我的项目,我必须超越:我不仅需要存储固定的对象值,还需要在值随时间变化时存储值。
就像一个成长中的人的长度一样:
通过添加另一个名为“time”的列来解决这个问题很容易。
但这个想法是更具可扩展性,例如:
所以现在这个值不仅有时间,还有坐标作为额外的子属性。我希望能够处理这些子属性。
问题是:是否有任何默认的最终可扩展的已知模型? (所以我不必重新发明轮子)
或者我应该在值中使用实体周围的包装器实体吗?
答案 0 :(得分:0)
好像你说时间和坐标适用于你的eav属性的所有。
在这种情况下,完美的解决方案似乎只是将time
和coordinates
(或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
}
}