- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的团队正在使用 GAE (Java) 编写一个应用程序,这让我对 BigTable 等面向对象数据库中实体关系建模(特别是多对多)的可扩展性产生了疑问。
在 App Engine 数据存储区中对无主一对多和多对多关系进行建模的首选解决方案(请参阅 Entity Relationships in JDO )似乎是键列表。然而,谷歌警告:
"There are a few limitations to implementing many-to-many relationships this way. First, you must explicitly retrieve the values on the side of the collection where the list is stored since all you have available are Key objects. Another more important one is that you want to avoid storing overly large lists of keys..."
说到过大的键列表,如果您尝试以这种方式进行建模,并假设您为每个键存储一个 Long,那么每个实体的限制为 1MB,理论最大数量为每个实体的关系约为 130k。对于一个主要优势是可扩展性的平台来说,这实际上并没有那么多关系。因此,现在我们正在考虑可能需要超过 13 万个关系的分片实体。
文章 Modeling Entity Relationships 中概述了一种不同的方法(关系模型)作为 AppEngine 开发人员资源中掌握数据存储系列的一部分。然而,即使在这里,谷歌也对关系模型的性能发出了警告:
"However, you need to be very careful because traversing the connections of a collection will require more calls to the datastore. Use this kind of many-to-many relationship only when you really need to, and do so with care to the performance of your application."
所以现在您会问:“为什么每个实体需要超过 13 万个关系?” 嗯,我很高兴您提出这个问题。让我们以一个拥有 100 万用户的 CMS 应用程序为例(嘿,我可以做梦吧?!)
用户可以上传内容并与以下人员共享: 1. 公开 2. 个人 3. 团体 4.任意组合
现在有人登录并导航到仪表板,其中显示了他们在任何组中所连接的人员的新上传内容。此仪表板应包含公共(public)内容以及专门与该用户或该用户所属的组共享的内容。还不错吧?让我们深入研究一下。
public class Content {
private Long id;
private Long authorId;
private List<Long> sharedWith; //can be individual ids or group ids
}
现在,我获取 id 允许查看的所有内容的查询可能如下所示:
List<Long> idsThatGiveMeAccess = new ArrayList<Long>();
idsThatGiveMeAccess.add(myId);
idsThatGiveMeAccess.add(publicId); //Let's say that sharing with 0L makes it public
for (Group g : groupsImIn)
idsThatGiveMeAccess.add(g.getId());
List<Long> authorIdsThatIWantToSee = new ArrayList<Long>();
//Add a bunch of authorIds
Query q = new Query("Content")
.addFilter("authorId", Query.FilterOperator.IN, authorIdsThatIWantToSee)
.addFilter("sharedWith", Query.FilterOperator.IN, idsThatGiveMeAccess);
显然我已经违反了几条规则。也就是说,使用两个 IN 滤波器会爆炸。即使单个 IN 过滤器的任何尺寸接近我们所讨论的极限也会爆炸。除此之外,假设我想限制并翻阅结果......不不!如果使用 IN 过滤器则无法做到这一点。我想不出任何方法可以在单个查询中执行此操作 - 这意味着如果没有大量的读取时处理和管理多个游标,您就无法对其进行分页。
以下是我能想到的用于执行此操作的工具:非规范化、分片或关系实体。然而,即使有了这些概念,我也不知道如何以可扩展的方式对这些数据进行建模。显然这是可能的。谷歌和其他公司一直在这样做。我就是不明白怎么办。 任何人都可以阐明如何对此进行建模,或者向我指出任何基于 NoSQL DB 的 cms 样式访问控制的好资源吗?
最佳答案
将 id 列表存储为属性将无法扩展。为什么不简单地为每个新关系存储一个新对象? (就像在sql中一样)。该对象将为您的 cms 存储两个属性:共享项目的 id 和用户 id。如果与 1000 个用户共享,您将拥有 1000 个用户。查询给定用户是很简单的。列出给定项目的权限或用户与其共享的内容的列表也很容易。
关于java - 在 NoSQL/BigTable (GAE) 中建模无限规模关系是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072566/
为什么 BigTable 被构造为“family:qualifier”的两级层次结构?具体来说,为什么要强制执行此操作而不是仅使用列,并且例如建议用户将其限定符命名为“vertical:column”
Google 现在允许您使用 BigTable(在 Google Cloud Platform 中托管为名为“Cloud Bigtable”的产品)开发应用程序。但是,我找不到太多关于如何为其设计模式
Google Cloud Bigtable 看起来很棒,但是我对备份和冗余有一些疑问。 是否有备份数据以防止人为错误的任何选项? 集群当前在单个区域中运行 - 是否有任何方法可以缓解区域不可用的情况?
我们有一些用例,希望在 Google Bigtable 中长期存储大量数据: 产品开发期间 用于性能调整 用于演示 我们需要存储数据,但我们并不真正需要它始终“在线”。当前的成本瓶颈似乎是节点的成本,
我想衡量 Cloud Bigtable 在获取具有特定前缀的键的许多行计数方面的性能。 假设一个模式的行键在末尾带有 unix 时间戳,例如,event_id#unix_timestamp。 如果我需
根据Cloud Bigtable performance docs我应该有一定的数据量来保证最高的吞吐量。 在“性能较慢的原因”下它说: The workload isn't appropriate
BigTable 是否支持类似于 INCR 的原子增量操作?在 Redis 中? BT的Golang库中有这个函数-https://godoc.org/cloud.google.com/go/bigt
我们正在试用 BigTable 并进行容量规划。我们认为一个节点可以满足我们实现初期的需求,以后我们会根据需要添加更多节点。我唯一的问题是,我们是否需要多个节点才能提供高可用性? (我对什么是“节点”
我们已经设置了具有 5 个节点的 Bigtable 集群,GCP 控制台指出它应该支持 50K QPS @ 6ms 的读取和写入。 我们正在尝试加载一个大型数据集(约 8 亿条记录),其中约 50 个
我有一个只有一个列族的表,该列的 TTL 为 24 小时,但我需要在截止日期前删除一些数据。 为了实现这个目标,我伪造了插入日期。例如:如果我需要在插入后 1 小时删除一行,我将插入日期设置为 23
我有一个只有一个列族的表,该列的 TTL 为 24 小时,但我需要在截止日期前删除一些数据。 为了实现这个目标,我伪造了插入日期。例如:如果我需要在插入后 1 小时删除一行,我将插入日期设置为 23
我正在尝试使用以下 YAML 配置文件部署 Bigtable 实例: resources: - name: foo-bigtable-instance type: bigtableadmin.v2
有人可以提供一个真实的例子来说明如何在 Bigtable 中构建数据吗?请从搜索引擎、社交网络或任何其他熟悉的角度讨论,清楚而务实地说明行 -> 列族 -> 列组合如何优于传统的规范化关系方法。 最佳
我创建了一个 Google Bigtable 集群。我正在尝试连接以下 this tutorial我试图下载他们的 cli 项目并构建它,但是当我尝试执行任何命令时它都会失败。我还尝试构建更简单的连接
避免热点的 Bigtable 行键方案? 一家公司需要您在 Google Bigtable 中创建一个架构,以允许对过去 2 年的记录进行历史分析。收到的每条记录每 15 分钟发送一次,其中包含设备的
我们目前正在调查使用多个列族对我们的 bigtable 查询性能的影响。我们发现将列拆分为多个列族并不会提高性能。有没有人有过类似的经历? 关于我们的基准设置的更多细节。此时,我们生产表中的每一行都包
假设有一行包含列族和其中的列。该列族有一个 gc 策略,并且该列中的所有值都刚刚过期。 那么,该行会发生什么情况?该行会被垃圾收集器删除吗?或者,它仍然存在并且可以访问吗? 我检查了文档,但只发现 h
假设有一行包含列族和其中的列。该列族有一个 gc 策略,并且该列中的所有值都刚刚过期。 那么,该行会发生什么情况?该行会被垃圾收集器删除吗?或者,它仍然存在并且可以访问吗? 我检查了文档,但只发现 h
来自 CBT 的文档 // READING OP HERE timestamp := bigtable.Now() mut := bigtable.NewMutation() mut.Set(colu
来自bigtable的论文。 bigtable我读到了这个: Each METADATA row stores approximately 1KB of data in memory. With a
我是一名优秀的程序员,十分优秀!