Database 大型应用程序-选择正确的数据库,并从中提供数据

Database 大型应用程序-选择正确的数据库,并从中提供数据,database,google-app-engine,design-patterns,google-cloud-datastore,nosql,Database,Google App Engine,Design Patterns,Google Cloud Datastore,Nosql,我最近一直在不停地做很多研究。我知道这是一个模糊的问题,但我会尽量具体。我开发中小型web系统已经有一段时间了,但从来没有处理过noSQL数据库,也没有做过这样规模的东西。这个问题的目的是做出正确的决定,因为我不想射中自己的脚。希望它能帮助像我这样的人,一个新的例子可以澄清更多的事情 在我看来 为了使这更容易,我将给出一个非常接近我试图实现的示例,它非常简单,涵盖了许多类似的系统。希望通过这个例子,我将清除我正在处理的数据类型、系统类型以及需要执行的操作 系统概述示例 1) 系统概述:假设我们正

我最近一直在不停地做很多研究。我知道这是一个模糊的问题,但我会尽量具体。我开发中小型web系统已经有一段时间了,但从来没有处理过noSQL数据库,也没有做过这样规模的东西。这个问题的目的是做出正确的决定,因为我不想射中自己的脚。希望它能帮助像我这样的人,一个新的例子可以澄清更多的事情 在我看来

为了使这更容易,我将给出一个非常接近我试图实现的示例,它非常简单,涵盖了许多类似的系统。希望通过这个例子,我将清除我正在处理的数据类型、系统类型以及需要执行的操作

系统概述示例

1) 系统概述:假设我们正在处理一个多租户系统,该系统允许用户跟踪其站点上特定页面的流量。用户/客户需要在他们的页面中植入我的系统代码,该代码将调用我的服务器上的服务,该服务仅将数据存储在数据库中。数据只是页面访问者的数据,比如他们访问的页面、浏览器、设备、访问时间等等。在这里,数据被存储

2) 用户/客户可以登录到系统并查看其数据。这里的数据是提供的

3) 除了存储和服务数据,系统中还有另一项服务,它将处理这些数据。以及找到网站访问者的模式/结论。例如,通过移动设备访问特定页面的次数更多。。(并对这一结论采取任何行动)。在这里,数据被处理

4) 我们谈论的是大量的数据。可能从每天写300-400万次(访问)开始,我想确保它可以扩展到10亿次+

问题1:

现在,我一直在为谷歌云解决方案绞尽脑汁。我认为最好使用AppEngine,因为我负担不起维护虚拟服务器的费用。我决定使用数据存储,下面是我的问题:

1)对于这种情况,数据存储是最合适的解决方案吗?

根据我的研究,我发现数据存储是最合适的,但当然,由于缺乏经验,我没有100%的信心。但是我选择这个是因为我经常使用SQL。我没有选择云SQL,因为我的数据不是那么相关,而且由于我的系统的容量以及可靠性和可伸缩性的需要,我认为NoSQL解决方案会更好。数据存储具有GQL语法,这类似于SQL查询语言。对象的属性也被索引。例如,我可能需要按设备类型读取/过滤数据。我还看到BigTable非常不同(可能不习惯),您拥有的所有数据都是Key:Value,我认为不可能/很难通过特定属性进行查询,例如

尽管我不相信我的数据是真正结构化的。特别是,我将为用户/客户(多租户)使用名称空间,它将自动包含在密钥中。目前我拥有的实体是用户(可能会包括它下面的几个实体),并且作为“独立”实体访问

问题2

向客户提供数据的最佳做法是什么?

我不想让客户看到数以百万计的访问。我会给他们整体的数据。例如,通过Android移动设备访问的次数。或时间范围内的统计信息。所以我认为有两种方法。首先,建立独立的数据库。或者可能是同一数据存储中的单独实体,它保存每个客户的每日总统计数据。然后通过加上“天统计”来发球,这感觉不对。第二,每次我想提供数据时,我都会对一个大数据库进行查询。但第二种方法也感觉不对。因为据我所知,数据存储没有“分组依据”功能,例如,或聚合。所以每次,客户都想“按设备”查看统计数据,我需要通过内存上的代码创建“按组”功能吗?或者,如果我只想显示特定过滤器查询结果的“计数”,我相信数据存储不直接支持它?同时,在提供数据时实时地进行这些计算听起来也很难

现在我知道Google有一个名为BigQuery的解决方案,我相信它可以满足我的需求,让我能够以高度的灵活性和效率向客户提供我想要的数据,但据我所知,它只适用于数据存储“备份”,我需要实时提供数据



我非常感谢任何人花时间就此事提供任何意见。非常感谢。几年前,我在Amazon AWS上使用MongoDB构建了一个类似的系统。今年,厌倦了在AWS上使用DevOps(向@AndreiVolgin致敬),我把它转移到了Google BigQuery上

我的用例的数据存储是过度的,坦率地说是有限的。无论如何,我都想关闭大多数属性的索引,以节省存储成本。限制,因为很难用可视化工具(如Tableau)连接基于数据存储的数据

关于

我知道谷歌有一个叫做BigQuery的解决方案,我 相信做我想做的事,并允许我提供我想提供的数据 客户具有很高的灵活性和效率,但据我所知 仅适用于数据存储“备份”,我需要实时提供数据


当我的系统接收到一个数据,页面访问者数据,在你的例子中,它。所以,不,它不仅适用于备份。你是否可以用它来报告“实时”取决于实时对你意味着什么。我的系统每隔几个小时计算一次汇总统计数据,以便向用户演示。

几年前,我使用Mon构建了一个类似的系统
Query<SomeEntity> q = ofy().load().type(SomeEntity.class).filter("platformType =", "MOBILE_ANDROID");
for (SomeEntity someEntity: q) {
    System.out.println(someEntity.toString());
}