有两种方法可以解决您的问题:Cassandra 等列数据库;或关系中的名称-值对(也称为属性-值对)。
首先,Cassandra 是一个结构化的键值对存储。一个键可以包含多个可变属性和值。值或列被分组到列族中。创建 Cassandra 数据库时,列族是固定的。族类似于逻辑数据模型中的实体或关系中的表。可以随时将列添加到族中。因此,列族的不同实例可以有不同的列,这正是您所需要的。此外,列被分配给指定的键,因此不同的键在任何给定的族中可以具有不同数量的列。
名称值对,也称为属性值对,可以在逻辑数据建模和关系中创建。这可以通过三个相关的实体或表来完成:
- 类似于列族的基本实体(例如客户)。
- 一个“类型”实体,描述属性及其特征,例如净值金额,
- “值”实体,将属性分配给基本实体的实例并为其分配值。
“类型”实体只是一个由类型代码标识并包含描述和其他域特征的代码表。域是指数据类型、长度、含义和度量单位。它描述了上下文之外的属性(即,未分配的)。一个例子可以是净值金额,它是一个 8 位数字,小数点后 2 位,右对齐,它的描述是“代表客户总财务价值的值,包括流动和非流动金额”。
“值”实体是由客户 ID 和属性类型代码标识的关联实体或表,并且具有将净值金额类型分配给客户并为其赋予值的值属性,例如“$2,000,000”。
但是,在关系中,名称-值对在 SQL 中查询起来有些困难,并且通常性能不佳。这可以通过将“类型”和“值”实体非规范化为一个来解决。而不是三个表,你有两个 - 一对多。实际上,这基本上就是 Cassandra 的做法。列族是完全展平的属性值对。
我希望这有帮助。如果你打算使用 NOSQL,我会使用 Cassandra 之类的东西。如果您使用关系,我会将类型和值非规范化(即合并为一个)。关系的优点是您已经拥有它。Cassandra 的缺点是你必须学习它,但它是为做你想做的事而构建的。