将对象存储在数据库中

时间:2009-08-21 01:03:23

标签: database

我有很多对象,每个对象都有许多不同的属性。许多属性重叠,例如,许多对象具有属性“name”。 由于有许多类型的对象,如果为每组具有相同属性集的对象构造一个表,则需要很多表。

目前我正在使用mysql,它以这种方式存储。

object_id|attribute_id|data

有这样的几个表,不同的表有不同类型的数据。 例如,在Integer表中,它只存储整数

所以我可以在系统中存储所有类型的对象,并且仍然可以根据属性的数据进行过滤和排序。它使查询更复杂,我认为它没有效率。

这是在mysql或其他关系数据库中执行此操作的唯一方法吗? 我是否应该尝试为此问题找到其他数据库模型?

修改 我做了一些研究,似乎我需要的是一个具有SQL功能的面向文档的数据库。

5 个答案:

答案 0 :(得分:5)

我认为你想要做的是研究称为“对象关系映射”的领域。这是一个有很多解决方案的大区域。一些用在框架中,例如“Rails中使用的ActiveRecord”。

答案 1 :(得分:5)

如果您想使用类似文档的RDBMS数据库,我认为您应该查看mongoDB

  

MongoDB的一个关键目标是弥合   键/值存储之间的差距(其中   快速且高度可扩展)和   传统的RDBMS系统(它们是   深入的功能)。

答案 2 :(得分:4)

您的设计称为对象属性值(OAV)。这是将对象映射到关系数据库的一种方法。它通常很慢,但非常灵活。如果您的班级定义不断变化(或动态变化),这可能是您唯一的选择。

您可以使用对象关系映射(ORM)。这是将对象创建到关系数据库的另一种方法。它更快,更不灵活。如果您的类定义不经常更改(并且不会动态更改),那么这是一个更好的选择。

答案 3 :(得分:0)

使用一个表是可能的,也许更可取。为所有对象类型的每个属性都有一个表列。然后再添加一列以指示“对象类型”。通过对具有特定对象类型名称的行的简单查询,您可以从表中获取一种类型的所有对象。

答案 4 :(得分:0)

使用ORM(这是一个非常好的主意)的替代方法是使用语言的内置序列化功能(如果它有一个,否则使用库)将对象转换为字节缓冲区,并且将其存储在数据库中,使用合适的密钥进行查找。这对于键值数据库(例如memcached)非常有效。