【问题标题】:Decorating an existing relational SQL database with NoSql features使用 NoSql 功能装饰现有的关系 SQL 数据库
【发布时间】:2012-08-22 10:17:00
【问题描述】:

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

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

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

在这两种情况下都失去了类型安全性,但我们实际上并不需要它。

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

【问题讨论】:

    标签: mysql sql nosql


    【解决方案1】:

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

    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 为这些数据类型提供的所有过滤方法方面工作得很好。

    我的两分钱!

    【讨论】:

    • 那将是选项 1 的扩展,但我喜欢强输入值的方法。谢谢。
    • 没错,我们选择了强类型的 [key, value] 数据存储。
    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 2013-10-29
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2017-03-19
    • 2015-12-06
    相关资源
    最近更新 更多