4

我最近遇到了设计数据库的需要。由于这是我第一次,我想我最好征求一些建议,以确保我建立在坚实的基础上。

目标

我想将对象(最好被认为是多映射的 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:我对关系数据库只有基本的理论知识和有限的实践经验,当然没有之前的专业经验。过去一周我一直在阅读这个主题,并掌握了一些我认为与我的案例相关的概念(规范化、外键等),但此刻我仍在阅读我的书。

4

1 回答 1

1

如果这是您第一次外出,并且您的项目与看起来一样重要,您可能需要投入时间和精力从头开始学习基础知识。CJ Date 和许多其他作者的书籍和在线教程可以带您了解基础知识。他们是优秀的作品。

IT 中的某些领域几乎完全是临时性的。不是这样的数据库设计。首先,大约 42 年前,EF Codd 在一个非常坚实的数学基础上奠定了基础,并且随着时间的推移,基本模型一直保持得很好。有进步,但几乎没有倒退。为了改变而改变很少。

SQL 在其漫长的生命周期中同样享有很大的稳定性。

其次,数据库设计中的反复试验可能代价高昂。有几十个案例表明,新手做出的不幸选择最终导致数百万的数据投资损失惨重,但没有成功。

反复试验有它的位置。技巧和窍门各有千秋。SO上的答案有它们的位置。但正式学习也是如此。

于 2012-12-05T18:17:56.437 回答