1

我们有一个关系数据库(MySql),其中有一个存储“Whatever”的表。此表有许多存储不同(逻辑和数据)类型的属性的字段。请求是要添加另外 150 个新的、不相关的属性。

我们当然不想添加 150 个新列。我看到另外两个选项:

  1. 添加一个简单的键值表(ID、FK_Whatever、Key、Value 和可能的类型),其中 *FK_Whatever* 引用 What ID 和Key将是属性的名称。使用 JOIN 进行查询是可行的。
  2. 一个大文本字段添加到 What 表并将150 个新属性序列化到其中(可能是 Xml)。在某种程度上,这将是 NoSql 存储数据的方式。查询这些字段意味着实现一些智能全文语句。

在这两种情况下都失去了类型安全性,但无论如何我们并不真正需要它。

我感觉这个常见问题有一个更聪明的解决方案(由于各种原因,我们无法迁移到 NoSql 数据库)。有人有提示吗?

4

1 回答 1

3

在我们需要为业务对象存储任意扩展属性的早期项目中,我们创建了一个扩展模式,如下所示:

CREATE TABLE ext_fields
{
    systemId INT,
    fieldId  INT,
    dataType INT // represented using an enum at the application layer.

    // Other attributes.
}

CREATE TABLE request_ext
{
    systemId   INT,  // Composite Primary Key in the business object table.
    requestId  INT,  // Composite Primary Key in the business object table.
    fieldId    INT,
    boolean_value BIT,
    integer_value INT,
    double_value  REAL,
    string_value  NVARCHAR(256),
    text_value    NVARCHAR(MAX),
}

给定的记录将仅具有基于 ext_fields 表中定义的字段的数据类型设置的 _value 列。这使我们不会丢失字段的类型及其值,并且在利用 DBMS 为这些数据类型提供的所有过滤方法方面工作得很好。

我的两分钱!

于 2012-08-22T10:25:14.547 回答