sql - 数据库设计 : how to avoid serialization when data structure is not static

标签 sql database sqlite database-design

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

目标

我想将对象(PO​​D 结构最好认为是多映射)存储在一个 用于存储和查询的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的所有属性。
  • 为 ClassA 类型的对象添加属性 A4。
  • 添加一个类型为 ClassC 的对象,该对象具有属性 A1="foobar", A2="bar"。

限制

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

其次,我不能使用对象内部结构的任何先验知识,因为这只会在运行时可用。例如,在上面的用例中,属性是事先不知道的。因此,虽然我曾考虑过将每个属性都作为一个表的设计,但我无法弄清楚如何在这样的设置中获取对象的所有属性。

环境

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

问题

满足所描述问题要求的适当、灵活的数据库设计是什么?

非常欢迎任何能带来有用见解或可靠设计的帮助、指示或技巧。

谢谢!

ps:我对关系数据库只有基本的理论知识和有限的实践经验,当然没有任何专业经验。过去一周我一直在阅读这个主题,并掌握了一些我认为与我的案例相关的概念(规范化、外键等),但此时我仍在阅读我的书。

最佳答案

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

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

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

其次,数据库设计中的反复试验可能代价高昂。在许多情况下,新手做出的不幸选择最终导致数百万美元的数据投资没有成功。

试错有其用武之地。提示和技巧各有所长。 SO 上的答案有它们的位置。但正式学习也是如此。

关于sql - 数据库设计 : how to avoid serialization when data structure is not static,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13727135/

相关文章:

xml - dbms_xmlgen.getxml - 如何设置日期格式

database - 什么是 clojure 中用于逻辑编程的好的/已建立的数据库支持策略

php - SQL 1064 错误 - 损坏的脚本

sql - Entity framework中如何OrderBy引用表列

sql - 使用 SSIS 清除 Excel 中的数据

SQLite - 帮助优化具有多个条件的先前行的总计

android - 在 Android 的数据库中保存图像

MySQL 事务 FOR COMMITING ON TRUE IF

mysql - 如何构建这个查询?

java - 从 SQLite 数据库读取数据到一个新的 Activity - Android Studio