具有许多属性的数据建模,其中很少适用于每条记录

Dom*_*c P 1 schema nosql database-design

我对数据建模很陌生,所以如果我错过了一些明显的东西,请原谅。我试图决定一个模式(或者可能是一个 DBMS)来处理一些数据,其中有很多可能的属性(可能是 60-100),但只有少数适​​用于每条记录。这是我看到的选项。

选项 1:非常宽的桌子

只需将每个属性包含为列,对于任何给定记录,大多数属性将为 NULL。

优点:保持架构简单,保持查询简单

缺点:不优雅,笨拙,添加/删除属性需要更改架构

选项 2:实体-属性-值模型

用于列出属性及其值的单独表格。这就是我之前看到这个问题的处理方式。例如,WordPress 在他们的*meta表格中使用了这样的东西。

优点:概念上易于理解,灵活

缺点:查询构造变得很痛苦,性能受到影响,最终会得到大量重复数据(即一遍又一遍地列出相同的属性名称)。

选项 3:NoSQL 文档或图形 DBMS

使用专为处理无模式数据而构建的 DBMS。我看过 MongoDB、RethinkDB 和 OrientDB。OrientDB 看起来很酷,但我不懂 Java,而且它似乎主要是 Java 的东西(例如,PHP 驱动程序看起来有问题)。

优点:专为处理灵活的模式而构建,速度快

缺点:关系似乎很困难,我没有使用它们的经验,似乎有很多重复的数据(例如,如果我想更改属性名称会发生​​什么?),查询似乎更复杂

附带说明一下,此应用程序不会获得很多流量,并且并发连接也很少。因此,可扩展性是一个相当小的问题。感谢您的任何建议。

Wal*_*tty 5

选项 4:类表继承

这是一种用于实现类/子类情况的设计技术。在这种情况下,属性通常只适用于一个子类,而不适用于表中的所有行。访问SO 中的同名标签以查看一系列相关问题和答案。

这具有消除 NULLS(大部分)的优点,提供快速简便的连接,并强制执行类:子类关系的 1:1 网络。

您的选项 1 有时称为“单表继承”