2009-08-21 169 views
3

我有很多对象,每个对象都可以有很多不同类型的属性。许多属性重叠,例如,许多对象具有“名称”属性。 由于有很多类型的对象,如果为每个具有相同属性集的对象集构造一个表,它将占用很多表。在数据库中存储对象

目前我使用的是一个mysql,它以这种方式存储。

object_id|attribute_id|data 

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

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

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

编辑 我做了一些研究,看来我需要的是一个具有SQL功能的面向文档的数据库。

回答

5

如果你想要去一个RDBMS般的面向文档的数据库,我想你应该考虑mongoDB

的MongoDB的一个主要目标是缩小键/值存储之间的差距 (其中 是快速和高度可扩展的)和 传统的RDBMS系统(其功能深度是 )。

+0

MongoDB的另一个好处就是它可以直接适用于您的情况,因为您可以拥有在一个集合中类似但不相同的所有不同类型的对象(类似于MySQL中的表)。如果您使用像Doctrine这样的良好ORM,它甚至可以自动区分对象的类型,并在PHP中从数据库加载它们时将它们转换为正确的对象。不知道你使用的是什么语言,但我敢打赌,如果它不是PHP,就会有类似的东西。 – cjroth 2011-02-04 02:36:07

5

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

0

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

+0

如果空间不是问题并且只有少数几个不同的属性,那么这将起作用。 虽然空间不是问题,但有很多属性(可能有数百个)。像mysql这样的数据库对行的存储量有限制,因此不可能。 – 2009-08-21 01:29:32

0

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

+0

这是一个好主意。但是这消除了关系数据库的真正好处。如果不需要过滤和排序,显然这是最好的做法(事实上,像东京内阁这样的关键/价值数据库已经足够好了)。但是我需要找到属性x大于10的所有对象。这种设计需要系统将所有对象读入内存并过滤这些对象。 – 2009-08-21 02:05:27

4

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

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