【发布时间】:2012-11-23 12:13:16
【问题描述】:
我最近遇到了设计数据库的需要。由于这是我的第一次,我想我最好征求一些建议,以确保我的基础稳固。
目标
我想将对象(最好被认为是多映射的 POD 结构)存储在 用于存储和查询的 SQL 数据库。对象的内容及其“结构”不断被修改。数据库将通过查询和更新进行密集访问。
用例
首先,每个对象都应该有一个唯一的标识符。
其次,存在不同类型的对象。例如,ObjectA 是 ClassA 的一个实例。 ClassA 可以具有属性 A1、A2、A3 等。因此,ObjectA 可以(但不是必需的,允许 NULL)具有这些属性的值。但是,这些属性中的每一个都可能有多个值,即:ObjectA.A1="foo" 和ObjectA.A1="bar" 都是可能的。 ClassA 的属性数量可以改变。为简单起见,属性只能添加,不能删除。
第三,属性并不特定于一个类,即:ClassB的对象也可以具有属性A1、A2等。因此ObjectB.A1="foo"也是可能的。我不确定这是否会改变任何东西,但我感觉它可能在每个属性对应一个表的设计中。
最后,必须支持以下伪查询和操作:
- 获取所有 ClassA 类型的对象,其属性 A1 等于“bar”。
- 获取ObjectB的所有属性。
- 为 ClassA 类型的对象添加属性 A4。
- 添加一个 ClassC 类型的对象,该对象具有属性 A1="foobar"、A2="bar"。
限制
首先,我想避免序列化数据,因此单列中的多个值是不可能的。数据库应该被规范化,数据结构应该是原子的。数据库会被非常频繁地查询,所以我不能浪费时间尝试实现复杂的查询机制。我最终会重新发明轮子(也可能是方形的)。
其次,我不能使用对象内部结构的任何先验知识,因为这只会在运行时可用。例如,在上面的用例中,属性是事先不知道的。因此,虽然我曾想过设计一个每个属性都是一个表格,但我无法弄清楚如何在这样的设置中获取对象的所有属性。
环境
我使用的是 SQLite 3.7,C++。
问题
满足所描述问题要求的适当、灵活的数据库设计是什么?
非常欢迎任何有助于获得有用见解或可靠设计的帮助、指示或提示。
谢谢!
ps:我对关系数据库只有基本的理论知识和有限的实践经验,当然没有以前的专业经验。过去一周我一直在阅读这个主题,并掌握了一些我认为与我的案例相关的概念(规范化、外键等),但目前我仍在阅读我的书。
【问题讨论】:
-
如果你不知道一个对象的属性,你就不能为它设计一个规范化的关系数据库。需要能够在运行时定义新对象和新属性将会非常痛苦。
-
这是可能使用EAV的时候了。但是,我会尝试先确定更多的要求,因为处理它们有点痛苦。
-
EAV 模型值得一看。您还可以使用在某些商业产品(如 Enterprise Elements)中发现的元模型和生成的物理模型的复杂实例化
-
@Clockwork-Muse - EAV 模型似乎是我应该进一步研究的东西。谢谢!
标签: sql database sqlite database-design