SQL在单个表中存储不同类型的对象

时间:2014-10-24 09:47:18

标签: mysql sql

我正在尝试定义一个数据库模式来存储"对象"在桌子上。

主要问题是我需要在表格中列出几何形状和其他类型的标记,以便将它们绘制到谷歌地图上。

例如,圆圈只有x,y和半径。折线会有一组点,一个正方形会有......等等......

我的第一个想法是创建两个相关的表,如:

对象

  • ID
  • 名称

object_details

  • ID
  • object_id(来自对象的外来物)
  • attribute_type(enum cartesian_point,size etc ....)
  • numeric_attribute_valueA
  • numeric_attribute_valueB
  • datetime_attribute_value
  • 等...

但这是一个非常丑陋且无用的实现,因为我可能需要更多不同的属性数据类型 - 比如文本或时间或其他任何东西,这会使架构复杂化,在object_details表中创建大多数空行。

我想问你对这个问题的看法。

对于这个问题,什么是好的/干净的解决方案?

此致

3 个答案:

答案 0 :(得分:2)

我建议您查看spatial extensions for MySQL和。{  postgresql的POSTGIS扩展,它支持在空间列中存储多种类型的几何体。

答案 1 :(得分:2)

您必须以某种格式打包数据,存储它,然后将其解压缩以供使用。例如,JSON,PHP和JS都支持。例如在PHP中:

$shape = array("kind"=>"circle", "cx"=>45,"cy"=>90,"r"=>20);
$json = json_encode($shape, JSON_NUMERIC_CHECK); // NUMERIC_CHECK doesn't treat numbers as strings

SQL:

$query = "INSERT into SHAPES set `shape`=>'$json'";

您可以使用“json_decode();”返回PHP数组

$shape = json_decode($json);

此外,这种格式使其易于与ajax和jquery一起使用,因为您的服务器可以直接提供JSON内容:

$.getJSON("server.php",function(response) {
   console.log("Kind is " + response.kind + ", radius is " + response.r);
});

答案 2 :(得分:1)

如果要避免使用空间扩展,可以考虑使用文本列并使用GEOJSON对象填充它。它看起来像Google maps can consume GeoJSON,因此可能适合您。