数据库设计:当数据结构不是静态时,如何避免序列化

时间:2012-12-05 15:52:14

标签: sql database sqlite database-design

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

目标

我想将对象(最好被认为是多图的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的所有属性。
  • 将属性A4添加到ClassA类型的对象。
  • 添加ClassC类型的对象,其属性为A1 =“foobar”,A2 =“bar”。

限制

首先,我想避免序列化数据,因此单个列中的多个值是不可能的。数据库应该规范化,数据结构应该是原子的。将非常频繁地查询数据库,因此我无法浪费时间尝试实现复杂的查询机制。我最终将重新发明轮子(也可能是正方形)。

其次,我不能使用对象内部结构的任何先验知识,因为这只能在运行时使用。例如,在上面的用例中,属性在之前是未知的。因此,虽然我想到了一个设计,其中每个属性都是一个表,但我无法弄清楚如何在这样的设置中获取对象的所有属性。

环境

我正在使用SQLite 3.7,C ++。

问题

什么是适合的,灵活的数据库设计,以满足所述问题的要求?

非常欢迎任何提供有用见解或坚实设计的帮助,指示或提示。

谢谢!

ps:我对关系数据库只有基本的理论熟悉和有限的实践经验,当然没有先前的专业经验。过去一周我一直在阅读这个主题,并且已经掌握了一些我认为与我的案例相关的概念(规范化,外键等),但我现在还在阅读我的书。< / p>

1 个答案:

答案 0 :(得分:1)

如果这是你第一次出去,而你的项目看起来很重要,你可能需要投入时间和精力从头开始学习基础知识。 CJ Date和许多其他作者都有书籍和在线教程,可以带您了解基础知识。它们是出色的作品。

在IT领域有一些领域几乎完全由adhocracy主导。不是那么数据库设计。首先,EF Codd在大约42年前为一个非常可靠的数学基础奠定了基础,并且随着时间的推移,基本模型已经很好地保持。已取得进展,但几乎没有回溯。为了改变,变化很小。

SQL在其较长的使用期限内同样享有很高的稳定性。

接下来,数据库设计的反复试验可能会非常昂贵。有数十个案例表明,新手做出的不幸选择最终导致数百万的数据投资损失惨重。

试验和错误有它的位置。提示和技巧有它们的位置。关于SO的答案有他们的位置。但正式学习也是如此。