【问题标题】:Using JSON-based Database for unordered data使用基于 JSON 的数据库处理无序数据
【发布时间】:2016-05-25 15:31:55
【问题描述】:

我正在为 Android 开发一个简单的应用程序。我在使用 Firebase 数据库时遇到了一些问题,因为它使用 JSON 对象并且我习惯于关系数据库。

我的数据将由共享一个值的两个用户组成。在关系数据库中,这将在如下表中表示:

**uname1**  **uname2** shared_value

其中用户名是键。如果我想要用户 Bob 与其他用户共享的所有值,我可以执行一个简单的联合语句,该语句将返回以下行:

uname1 == Bob or unname == Bob

但是,在 JSON 数据库中,数据中似乎存在树状层次结构,这很复杂,因为我无法在顶层搜索用户。如果我最常见的搜索与上述搜索类似,我正在寻求有关如何执行此操作或如何构建数据库以获得最佳效率的帮助。

如果这些信息还不够,我会详细说明:我的数据库的结构如下:

{
     'username': 'Bob' 
            {
                   'username2': 'Alice'
                         {
                               'shared_value' = 2
                         }
            }
      'username': 'Cece'
            {
                   'username2': 'Bob'
                         {
                               'shared_value' = 4
                         }
            }

从示例中可以看出,Bob 包含在两个关系中,但查看 Bobs 节点不会显示该信息。 (关系是可交换的,所以无法预测谁是“第一”)。

解决此问题的最直观方法是复制所有数据。例如,当我们添加 Bob->Alice->2 时,还要添加 Alice->Bob->2。根据我在关系数据库方面的经验,重复可能是一个大问题,这就是为什么我还没有这样做的原因。此外,复制似乎是一种低效的解决方法。

【问题讨论】:

  • 如何为数据建模是一个见仁见智的问题。并且根本不需要在文档中包含嵌套(分层)数据。这只是一种可能性,参考文件也是如此。
  • 这不是有效的 JSON。您的子文档上的标签是什么?

标签: json mongodb database


【解决方案1】:

你有什么理由不反转这个吗?像这样的集合怎么样:

{ "_id": 2, "usernames":[ "Bob", "Alice"]}
{ "_id": 4, "usernames":[ "Bob", "Cece"]}

如果您需要“Bob”的所有值,请在“用户名”上编制索引。

编辑:

如果您需要两个用户名作为唯一键,请执行以下操作:

{ "_id": {"uname1":"Bob", "uname2":"Alice"}, "value": 2 }

但这仍然允许创建:

{ "_id": {"uname1":"Alice", "uname2":"Bob"}, "value": 78 }

(顺便说一句,这个问题也存在于您的关系模型中。您如何处理它?)

一般来说,我认为通过创建多个名称为"attr1""attr2""attr3" 等的列来实现一个数组,然后必须在所有列中搜索可能的值是关系表建模的产物,它不支持数组值。如果您要转换为面向文档的存储,这些确实应该是嵌入的值列表,并且您应该使用文档范式并对其进行建模,而不是仅仅将表格行重新实现为文档。

【讨论】:

  • 也许这是我对sql的偏见或我的误解,但这不会让我与鲍勃爱丽丝组合有各种各样的整体吗?这两个用户名应该是一个键
  • 你是对的,关系模型还是会有这个问题。我想我没有发现这是一个问题,因为工会声明是如此简单,我什至没有注意到它。我想我会使用你建议的结构,谢谢!
【解决方案2】:

您仍然可以使用旧结构:

[
    { username: 'Bob', username2: 'Alice', value: 2 },
    { username: 'Cece', username2: 'Bob', value: 4 },
]

您可能希望在“用户名”和“用户名2”上创建索引以提高性能。然后做同样的联合。

【讨论】:

  • 你完全正确。但是,这并不妨碍我拥有两个条目,其中包含“Bob”和“Alice”,这应该是一个键。
【解决方案3】:

要创建树状结构,最好的方法是创建一个“祖先”数组来存储特定条目的所有祖先。这样,您可以查询祖先或后代以及与树中特定值相关的所有文档。使用您的示例,您将能够搜索 Bob 的所有后代,或他的任何祖先(和相关文档)。

上面的答案建议:

{ "_id": {"uname1":"Bob", "uname2":"Alice"}, "value": 2 }

没错。但是你看不到 Bob 和 Cece 与这个设计之间的关系。我来自 Mongo 的建议是将祖先键存储在祖先数组中。

{ "_id": {"uname1":"Bob", "uname2":"Alice"}, "value": 2 , "ancestors": [{uname: "Cece"}]}

使用这种设计,您仍然会得到重复,这是您不想要的。我会这样设计:

{"username": "Bob", "ancestors": [{"username": "Cece", "shared_value": 4}]}
{"username": "Alice", "ancestors": [{"username": "Bob", "shared_value": 2}, {"username": "Cece"}]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2013-07-12
    • 2021-09-12
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多