什么是在数据库中存储形状的最佳方式

时间:2011-07-25 02:49:36

标签: java mysql shape

我正在实现一个处理Java Shapes的应用程序。每个用户登录并从MySql数据库中检索库存。形状有不同的构造函数和行为。

那么,存储形状的最佳方法是什么?这是我的一些想法:

  • 序列化形状并将其存储为Blob。但是如果我必须更改Shape类,并且需要更大的数据库和查询性能,我会遇到版本控制问题
  • 使用常用字段(如宽度和高度)创建一个Shape表,并为每个引用Shape表的形状创建一个表。这可能导致很多表......
  • 创建一个包含所有可能字段的Shape表,并将null设置为不需要该字段的形状...

您怎么看?

5 个答案:

答案 0 :(得分:2)

技术上不是答案,但也许这里的问题是SQL?我认为像CouchDB这样的文档存储系统可能是这种情况下更有效的解决方案。

我在想这样的事情:

{
    "_id": "whatever",
    "_rev": "whatever",
    "boundingBox": [
        [0 0],
        [2 2]
    ],
    "size": [2 2],
    "circle": {
        "center": [1 1],
        "radius": 1
    }

}

"circle"节将根据形状更改名称和详细信息。矩形会有角(类似于"boundingBox"),椭球会有...无论什么定义椭球:p

答案 1 :(得分:1)

一些简单的想法:

  • 您可以存储定义多边形的顶点列表。
  • 您可以存储定义多边形边缘的矢量列表。

如何将它们存储在数据库中:

  • 主表形状,主键是一个名为“shapeID”的标识
  • 向量表,主键标识vectorID,适当ShapeID的外键,原点(x,y,z coords),方向(x,y,z)和长度。

可以将其他元数据分配给具有其他表的形状,这些表也通过外键引用shapeID。

答案 2 :(得分:1)

实际上,没有一种“最佳”方法可以在数据库中存储继承层次结构。大多数数据库课程都教授3种模型:带有空值的单表,每个子类的表和每个混凝土类的表。你可以在this blog post找到一个很好的解释。如果您只想在数据库中映射形状的属性,则可以选择您喜欢的任何一个。

如果你想要更高级的东西,MySql提供专门用于存储几何形状的Geometry type

答案 3 :(得分:1)

我投票:

  • 创建一个包含所有可能字段的Shape表:

    • 喜欢宽度和高度
    • 基础和高度
    • 半径 ...
    • 形状类型(例如0 =圆形,1 =方形,3 =三角形,......)
  • 一张桌子,所有可能的形状,一个形状实例/行

... IMHO

问:你认为你有多少种不同的形状?您认为每个形状可能需要多少列?

PS: “多边形”(由任意数量的点组成)可能值得两个单独的表。但大多数形状(圆形,椭圆形,正方形,矩形等)不应超过4或5列/实例,并且应该很容易放在一个表中。

答案 4 :(得分:0)

我选择了第二种解决方案,因为它易于管理和扩展。序列化选项不实用,因为如果序列化模型的结构发生变化(例如:添加属性),我必须管理模型版本。第三种选择不是构建数据库的正确方法。