【问题标题】:Any databases that allow you to specify optimized data structure versions of your tables任何允许您指定表的优化数据结构版本的数据库
【发布时间】:2018-02-09 03:19:18
【问题描述】:

我知道 Redis 允许您以优化的方式存储复杂的数据结构。但我想知道是否有任何数据库或设计模式允许您指定数据库块的优化版本。

例如,要通过文本快速查找内容,您必须使用 solr 进行搜索,这是它自己的数据库,专门用于优化通过字符串查找。

另一个例子是,如果您想为用户返回一个易于导航的角色对象,您可能希望这样:

var user = { roles: { admin: true, principal: true, ... } } 

但在数据库中,您可能有一个 roles 表和一个 users 表,因此您进行连接并取回它们并最终在您的代码中手动构建该数据结构。

问题是,是否有任何东西可以让您直接在数据库中指定数据的数据结构/形式,以便更快地查找。数据库允许您拥有索引,这是一种原始解决方案。想知道是否有更复杂的例子。例如,检查项目是否有标签的好方法是:

user.tags[tagName]

这意味着你的标签是这样的:

{ tagA: true, tagB: true, ... }

但您可能会像这样从数据库中获取它们:

[ { name: tagA }, { name: tagB } ]

所以想知道是否有办法告诉数据库,以这种“x”格式创建数据集的“优化版本”,而不必在应用程序层手动执行此操作。想知道是否有任何工具或设计模式。

【问题讨论】:

标签: database optimization design-patterns


【解决方案1】:

如果你想优化一个特定的数据结构,你总是可以在低级数据库上自己优化它,像 SQLite 这样简单,或者像 PostgreSQL 这样复杂,并通过添加数据库对象处理使其易于使用层。如果你不想自己优化它。根据我的经验,Django Web 框架做得非常好,它可以轻松地在 RMDB 中存储和接收对象,而不会限制我对数据库本身进行修补的访问。

通过此解决方案,您可以使用 RMDBlike OODB,并在您的结构中进行一些额外的设计(听上去,您已经拥有了)。并且仍然允许您为您的特定结构/访问要求选择优化的数据库存储引擎。

【讨论】:

    【解决方案2】:

    您提到了一个 key-val 存储(好吧,如果是 Redis 一个数据结构存储), 以及执行严格数据方案的关系数据库管理系统。

    如果我正确理解了您的问题,您需要介于两者之间 - 不像 redis 那样低级,也不像 rdbms 那样限制性

    我建议给document-oriented store一个机会

    面向文档的数据库或文档存储是一种计算机程序 设计用于存储、检索和管理面向文档的 信息,也称为半结构化数据。

    这里是你翻译成mongodb的例子

    MongoDB 是一个开源的文档数据库,旨在简化 发展和规模化

    这是第一个

    var user = { roles: { admin: true, principal: true, ... } }
    
    > db.createCollection('user');
    { "ok" : 1 }
    > db.user.insert({roles: ['admin', 'principal']})
    WriteResult({ "nInserted" : 1 })
    
    > db.user.insert({roles: ['admin']})
    WriteResult({ "nInserted" : 1 })
    
    > db.user.find()
    { "_id" : ObjectId("5a8f1ae9442b9e31f71b156c"), "roles" : [ "admin", "principal" ] }
    { "_id" : ObjectId("5a8f1c46442b9e31f71b156d"), "roles" : [ "admin" ] }
    

    你看到了吗?看起来很简单

    第二个

    { tagA: true, tagB: true, ... }
    

    使用前面的示例(对于 tags 或其他任何类似的工作)

    > db.user.find({roles: {$in: ['principal']}})
    { "_id" : ObjectId("5a8f1ae9442b9e31f71b156c"), "roles" : [ "admin", "principal" ] }
    

    您甚至可以在角色上创建索引!

    > db.user.ensureIndex({roles: 1})
    
    > db.user.find({roles: {$in: ['principal']}}).explain()
    ...
            "winningPlan" : {
                "stage" : "FETCH",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "roles" : 1
                    },
                    "indexName" : "roles_1",
    ...
    

    除了一堆灵活的 CRUD 操作之外,还有很多花里胡哨的功能,例如 aggregation,可以让您就地处理您的数据。

    还有很多其他面向文档的解决方案,例如,根据数据耐用性 / 性能 / 可扩展性 要求,它们各有优缺点你的应用

    但无论如何,它都不是灵丹妙药,也不是您描述的混合方法,即使用 rdbms + 全文搜索系统 或一些内存中的 k/ v 像 memcached/redis 这样针对特定任务的计数器可能是最好的方法

    【讨论】:

      【解决方案3】:

      对象数据库 (OODB) 可以按照您描述的方式存储对象。一个缺点是它们通常与一种或两种编程语言高度耦合,不适合运行报告或导出到其他系统。

      https://en.wikipedia.org/wiki/Object_database

      https://en.wikipedia.org/wiki/Comparison_of_object_database_management_systems

      文档数据库(或 NoSQL)存储对象层次结构的语言中立表示(通常是 JSON)。架构有时是在您编写数据之前定义的,但更多时候架构是由您的查询定义的(读时架构范式)。它们可以存储数据之间的关系,但出于分析目的,它们更难查询。 (即,您如何找出哪些对象/文档具有最多的共同标签?)

      关系数据库存储可以在查询时以不同方式组合的数据集。架构通常在您存储数据之前定义(写时架构)。特定语言的对象关系映射器 (ORMS) 用于简化编程语言和关系集之间对象的存储和检索。

      一些传统的关系数据库可以将层次结构存储在 JSON 或 XML 列中。这提供了模式读取文档数据库 (noSQL) 的一些好处。您可以使用 XPath 或特殊的 JSON 表达式来查询存储在列中的结构。

      CREATE TABLE `book` (
        `id` int(ii) unsigned NOT NULL AUTO_INCREMENT,
        `title` varchar(255) NOT NULL default '',
        `tags` json DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB;
      
      SELECT * FROM `book` 
      WHERE JSON_CONTAINS(tags, '["JavaScript"]');
      

      这些描述是广泛的概括,您可以在其中一个标签所指的产品中找到不同功能和技术的示例。例如,并非所有 noSQL 数据库都是读取模式:Solr 和 Cassandra 需要在写入之前定义模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-30
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多