我有很多对象,每个对象都有许多不同的属性。许多属性重叠,例如,许多对象具有属性“name”。 由于有许多类型的对象,如果为每组具有相同属性集的对象构造一个表,则需要很多表。
目前我正在使用mysql,它以这种方式存储。
object_id|attribute_id|data
有这样的几个表,不同的表有不同类型的数据。 例如,在Integer表中,它只存储整数
所以我可以在系统中存储所有类型的对象,并且仍然可以根据属性的数据进行过滤和排序。它使查询更复杂,我认为它没有效率。
这是在mysql或其他关系数据库中执行此操作的唯一方法吗? 我是否应该尝试为此问题找到其他数据库模型?
修改 我做了一些研究,似乎我需要的是一个具有SQL功能的面向文档的数据库。
答案 0 :(得分:5)
我认为你想要做的是研究称为“对象关系映射”的领域。这是一个有很多解决方案的大区域。一些用在框架中,例如“Rails中使用的ActiveRecord”。
答案 1 :(得分:5)
如果您想使用类似文档的RDBMS数据库,我认为您应该查看mongoDB:
MongoDB的一个关键目标是弥合 键/值存储之间的差距(其中 快速且高度可扩展)和 传统的RDBMS系统(它们是 深入的功能)。
答案 2 :(得分:4)
您的设计称为对象属性值(OAV)。这是将对象映射到关系数据库的一种方法。它通常很慢,但非常灵活。如果您的班级定义不断变化(或动态变化),这可能是您唯一的选择。
您可以使用对象关系映射(ORM)。这是将对象创建到关系数据库的另一种方法。它更快,更不灵活。如果您的类定义不经常更改(并且不会动态更改),那么这是一个更好的选择。
答案 3 :(得分:0)
使用一个表是可能的,也许更可取。为所有对象类型的每个属性都有一个表列。然后再添加一列以指示“对象类型”。通过对具有特定对象类型名称的行的简单查询,您可以从表中获取一种类型的所有对象。
答案 4 :(得分:0)
使用ORM(这是一个非常好的主意)的替代方法是使用语言的内置序列化功能(如果它有一个,否则使用库)将对象转换为字节缓冲区,并且将其存储在数据库中,使用合适的密钥进行查找。这对于键值数据库(例如memcached)非常有效。