【问题标题】:SQL Store different types of objects in a single tableSQL 将不同类型的对象存储在一个表中
【发布时间】:2019-07-28 22:54:12
【问题描述】:

我正在尝试定义一个数据库模式以在表中存储“对象”列表。

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

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

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

对象

  • 身份证
  • 姓名

object_details

  • 身份证
  • object_id(来自对象的外部)
  • attribute_type(枚举笛卡尔点、大小等......)
  • numeric_attribute_valueA
  • numeric_attribute_valueB
  • datetime_attribute_value
  • 等等……

但这是一个非常丑陋且效率低下的实现,因为我可能需要更多不同的属性数据类型 - 例如文本或时间或其他任何内容,这会使在 object_details 表中创建大部分空行的架构变得复杂。

对此有什么好的/干净的解决方案?

更新:

在将近 5 年之后阅读这个问题,我强烈建议考虑使用任何 Schema-Less 数据库来解决此类问题。

【问题讨论】:

  • 这听起来像是古老的 EAV vs Relational Model 辩论的变体。答案实际上取决于您要存储多少不同类型的对象,以及添加新对象的频率。
  • @GarethD 感谢您的参考。同意。

标签: mysql sql


【解决方案1】:

您必须以某种格式打包数据、存储数据并在以后解包以供使用。比如 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】:

我建议看看spatial extensions for MySQLPOSTGIS 对 postgresql 的扩展,它们都支持在空间列中存储多种类型的几何。

【讨论】:

  • 总的来说,MySQL 手册非常好。在几何方面它有点薄,但有一些教程涵盖了这一点。
【解决方案3】:

如果您想避免使用空间扩展,可以考虑使用文本列并使用GEOJSON 对象填充它。它看起来像 Google maps can consume GeoJSON,所以这可能对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2021-04-08
    • 2018-07-20
    • 2022-06-16
    相关资源
    最近更新 更多