Database design 值中具有子属性的高级EAV
实体属性值数据库表是保存自定义对象属性的灵活方法 对于我的项目,我必须超越:我不仅需要存储对象的固定值,还需要存储随时间变化的值 就像一个成长中的人的长度:Database design 值中具有子属性的高级EAV,database-design,relational-database,entity-attribute-value,Database Design,Relational Database,Entity Attribute Value,实体属性值数据库表是保存自定义对象属性的灵活方法 对于我的项目,我必须超越:我不仅需要存储对象的固定值,还需要存储随时间变化的值 就像一个成长中的人的长度: 实体:彼得 属性:长度 值:2010年1月1日为160厘米,2011年1月1日为170厘米 通过添加另一个名为“时间”的列,很容易解决这个问题 但我们的想法是更具可扩展性,例如: 实体:视频 属性:标记 值:0:20时XY(100200)处的Peter,0:30时XY(200300)处的Peter 所以现在这个值不仅有时间,还有坐标
- 实体:彼得
- 属性:长度
- 值:2010年1月1日为160厘米,2011年1月1日为170厘米
- 实体:视频
- 属性:标记
- 值:0:20时XY(100200)处的Peter,0:30时XY(200300)处的Peter
或者我应该在值中的实体周围使用包装器实体吗?您似乎在说时间和坐标适用于所有eav属性 在这种情况下,似乎完美的解决方案是简单地将
时间
和坐标
(或分别添加x和y)添加到eav表中
拥有eav的全部原因是当您拥有潜在的无限数量的属性时。但是,如果有一些属性是应用于所有其他属性的超级属性,那么没有理由不扩展该eav表
e、 g
然后可以执行如下查询:
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`
那会给你一个这样的结果
实体id时间坐标
25 | 12/12/12|200,300~12/13/12|0,1
26 | 12/12/12 | 150,99~12/29/12 | 151180~12/30/12 | 60,60
然后,您可以使用PHP(或其他任何东西)按实体id解析结果
例如(返回查询结果后)
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`
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
}
}