Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 值中具有子属性的高级EAV_Database Design_Relational Database_Entity Attribute Value - Fatal编程技术网

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
  }
}