问题标签 [schema-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
826 浏览

mongodb - 具有大量内部文档的MongoDB数据结构

我对 MongoDB 比较陌生,到目前为止印象非常深刻。不过,我正在努力寻找设置文档存储的最佳方法。我正在尝试使用推特数据进行一些摘要分析,但我不确定是将推文放入用户文档中,还是将它们保存为单独的集合。似乎将推文放在用户模型中会很快达到大小的限制。如果是这种情况,那么在一组用户的推文中运行 MapReduce 的好方法是什么?

我希望我不会太含糊,但就设置我的域模型而言,我不想过于具体和走得太远。

我相信你们都听腻了,我已经习惯了 RDB 土地,在那里我会布置我的模式,比如

似乎 Mongo 中的逻辑模式是

但不会很快使用户文档膨胀到超出容量。但我想对属于具有相似 somegroupID 的用户的推文进行分析。上面的模型布局在概念上是有意义的,但是在什么时候这太笨拙了?什么是可行的替代方案?

0 投票
1 回答
3371 浏览

sql - 找到关系方案的最小键

我有一个投资公司的数据库:

  • B(经纪人)
  • O(经纪人办公室)
  • 我(投资者)
  • S(库存)
  • Q(投资者拥有的股票数量)
  • D(股票支付的股利)

功能依赖

  • S ⟶ D
  • 我⟶B
  • 是⟶Q
  • B⟶O

我需要找到关系方案 R=BOSQID 的最小密钥并需要证明它。

我不知道如何解决这个问题。你能给我任何想法吗?

0 投票
1 回答
105 浏览

mongodb - 仅在 MongoDB 上创建集合

我只想创建集合结构。即说产品集合包含类别列表。

我想通过创建此依赖项来指定此容器结构,但我不想创建任何集合条目(例如,某处有一个加载程序可以批量上传数据)。

RDBMS 中的壁橱类比是:DBA 创建具有约束和依赖关系的模式设计;应用程序或 ETL 工具加载实际数据。

我看到的大多数示例只是创建一个示例集合,然后调用 db.insert(document) 或 db.save(document)

在 MongoDB 中甚至有可能吗?

如果问题不清楚,请告诉我。

谢谢

0 投票
1 回答
272 浏览

php - 将 MySQL 应用程序移植到 MongoDB 并容纳 _id 字段

我有一个 PHP 应用程序,它可以连接到多个后端(目前是 MySQL 或 XML),并且我也在尝试使用 MongoDB。我显然在努力解决的一个看似次要的问题是 Mongo 要求 '_id' 是主键的名称。后端通常由应用程序很好地抽象,但应用程序确实需要定期使用 id,所以我使用类似的代码访问它,$result['id']到目前为止,它已经很好地抽象了。

但是现在我面临着试图(有效地!)处理一个不允许我使用 'id' 作为其主键的数据库,而且我不确定最好的选择是什么。到目前为止,这是我的想法:

  1. 只需保留 Mongo 的 '_id' 值,并将应用程序变量设置$id"id""_id"取决于后端。应用程序应该使用$idID 字段来访问,而不是硬编码的"id". 请注意,所有其他字段都通过其字符串名称访问,例如,$result['user']这将违反应用程序中的规范。

    优点:允许在可能的情况下直接返回 MongoCursor 对象,确保最小的内存使用和快速访问数据。

    缺点:不向后兼容,需要(相当繁琐)重构使用此应用程序的任何代码。

  2. 将返回的 MongoCursor 对象包装在一个新的迭代器类中,该迭代器类返回具有适当"_id"映射到的每个项目"id"。当与 Mongo 通信时,应用程序会将入站调用映射"id"回。"_id"

    优点:保留 1. 的大部分内存效率,同时防止大多数向后兼容问题。

    缺点:不完全确定如何实现这样的对象,不相信它可以干净地完成,或者它实际上会像我想象的那样工作。为了做到这一点,我还想为其他后端实现类似的迭代器包装器。

  3. 使用 中所述将结果加载到内存iterator_to_array()MongoCollection.find(),进行适当的转换,然后返回数组。

    优点:概念上比 2. 简单,可以很好地与我的应用程序的其余部分配合使用。

    缺点:在内存方面显然是一个糟糕的选择。鉴于该应用程序不是世界末日,但仍然不理想。

这些选项中的任何一个是否作为该问题的特别合理和强大的解决方案脱颖而出?任何人都可以建议以与后端无关的方式处理主键的其他替代方案吗?未来可能会出现额外的后端,因此也欢迎与其他数据存储系统相关的给定方法的问题或好处。

我目前倾向于 2.,但我欢迎你的想法。

0 投票
1 回答
3127 浏览

hadoop - 用于实时分析解决方案的 HBase 模式/键

我们正在考虑使用 HBase 进行实时分析。

在 HBase 之前,我们将在我们的日志文件上运行 Hadoop Map Reduce 作业并聚合数据,并将细粒度的聚合结果存储在 HBase 中,以便对聚合数据进行实时分析和查询。因此,HBase 表将具有预先聚合的数据(按日​​期)。

我的问题是:如何最好地设计 HBase 数据库的架构和主键设计,以实现快速但灵活的查询。

例如,假设我们将以下行存储在数据库中:

假设我们的 map-reduce 作业产生三个不同的输出字段,我们希望将每个字段存储在一个单独的“表”(HBase 列族)中:

  • 日期、操作系统、浏览器
  • 日期、网址、推荐人
  • 日期、网址、国家

(我们的 map-reduce 作业从用户代理和 client_ip 数据中获取操作系统、浏览器和国家字段。)

我的问题是:我们如何构建 HBase 模式以允许对这些字段中的任何一个或组合进行快速、近实时和灵活的查找?例如,用户必须能够指定:

  • operating_system 按日期(“此日期范围内有多少 iPad 用户?”)
  • url 按国家和日期(“上个月有多少用户从该国家/地区访问此 url?”)

基本上还有其他自定义查询?

我们应该使用这样的键:

  • date_os_browser
  • date_url_referrer
  • date_url_country

如果是这样,我们可以完成上面指定的查询吗?

0 投票
3 回答
114 浏览

mongodb - 如何在 mongodb 中进行“不在”操作?

我有两个系列——购物者(某一天在店里的每个人)和海滩游客(某一天在海滩上的每个人)。每天都有条目,人们可以在海滩上,或者购物,或者两者都做,或者任何一天都不做。我现在想查询 - 过去 7 天内没有去海滩的所有购物者。

我是 Mongo 的新手,所以我的模式设计可能不适合 nosql 数据库。我看到了关于 join 的类似问题,并且在大多数情况下,建议进行非规范化。因此,我能想到的一种解决方案是创建集合 - 活动、日期索引、嵌入用户的操作。所以像

现在插入变得昂贵,因为现在我必须在插入之前进行查询。

0 投票
1 回答
4332 浏览

mongodb - 带有 MongoDB 的重复事件模式

我已经阅读了一些描述重复事件的数据存储方法的论文,但我仍在尝试围绕最佳实践,尤其是关于 MongoDB。

我主要关心的是廉价地检索给定时间范围内发生的所有事件。我的次要关注是修改和更改单个事件,而不会使整个事件链失控。

看看其他提出类似问题的人,我想出了一个可能性。我并没有完全接受它,并且会喜欢一些正确方向的指示。

我的想法:在每个事件文档中,有...

  • 与 iCal 标准非常匹配的重复出现的字符串字段
  • 包含对特定事件的更改/编辑(例如更改描述或开始时间,或取消单个事件)的“发生”嵌入文档或数组字段。
  • 一个发生开始和结束字段,用于定义重复规则的易于查询的边界

优点:

  • 能够存储更改并仍然保持与其他事件的关联
  • 很容易询问,我在业务方面的模型将不得不构建每个事件

缺点/潜在问题:

  • 如果编辑事件,并且用户决定将更改标记为应用于“所有事件” - 如何防止已经过去的事件被更改
0 投票
1 回答
599 浏览

database - 仅使用不可预测数量的外键构建多对多数据库模式

下午好(至少在这附近),

我有一个多对多关系模式,但在构建时遇到了麻烦。主要问题是我只使用主键和外键(没有 varchars 或枚举来简化事情),并且多对多关系的数量是不可预测的,并且可以随时增加。

我环顾了各种问题,找不到直接解决这个问题的东西。

我把问题分成两半,所以我现在有两个一对多的模式。一个解决了,但另一个让我很不舒服。

让我们假设表 FOO 是一个标准的、无聊的表,它有一个简单的主键。它是一对多关系中的一个。

表 BAR 可以与 FOO 的多个键相关。事先不知道相关键的数量。

一个例子:

  1. 从查询 FOO 返回 ids 3、4、5。
  2. BAR 需要一个与 3、4、5 相关的唯一键(尽管可能返回任意数量的 id)

通常的连接表不起作用:

由于 FOO 返回 3 个唯一键,并且此处 bar_id 与 foo_id 具有一对一的关系。

拥有两个连接表似乎也不起作用,因为它仍然无法将 foo_ids 3、4、5 映射到单个 bar_id。

我究竟做错了什么?我让事情变得比他们更复杂吗?我应该如何处理这个问题?非常感谢您的帮助。

0 投票
2 回答
171 浏览

mongodb - 为特定项目设计 mongodb 模式:嵌入文档或使用外键

在我的项目中,它有 3 个模型:

  1. 城市
  2. 广场
  3. 店铺

一个城市有广场和商店;一个广场有商店。

我最初的设计是为关系使用“外键”。(我是从mysql和jsut开始接mongodb的)

我觉得这个设计很像sql的做法。

项目范围是这样的:5个城市;每个城市有5个广场;一个广场有200家商店。一家商店有许多产品(上面的代码中没有建模)

我将查询一个城市或一个广场的所有商店;一个城市的所有广场。

我应该在 City collection 中嵌入所有商店和广场吗?我听说不要在 mongodb 中使用引用,而是使用嵌入文档。在我的具体项目中,哪一个是更好的方法?对我来说,我对“外键”设计感到满意,但害怕不利用 mongodb。

0 投票
1 回答
113 浏览

hbase - 把桌子放在桌子上

我有一个看起来像这样的架构设计:

所以,它是表中的表。我的问题是,如何使用 HBase shell 在表中添加表?我知道将值添加到特定列族中的列的“put”命令。但是,它使我无法在表格中添加表格。有谁知道如何做到这一点?

谢谢,利安德

6月25日更新,

谢谢塔里克!我以这种方式修复了它(受您的回答启发)