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