我们正在研究开发一种工具来捕获和分析我们收集的大量网络流量数据。每天我们捕获大约 14 亿条流记录,它们的 json 格式如下所示:
{
"tcp_flags": "0",
"src_as": "54321",
"nexthop": "1.2.3.4",
"unix_secs": "1352234521",
"src_mask": "23",
"tos": "0",
"prot": "6",
"input": "105",
"doctets": "186",
"engine_type": "0",
"exaddr": "2.3.4.5",
"engine_id": "2",
"srcaddr": "9.8.7.6",
"dst_as": "12345",
"unix_nsecs": "752265174",
"sysuptime": "2943529544",
"dst_mask": "24",
"dstport": "80",
"last": "2943523241",
"srcport": "52672",
"dpkts": "4",
"output": "111",
"dstaddr": "6.5.4.3",
"first": "2943517993"
}
Run Code Online (Sandbox Code Playgroud)
我们希望能够对数据集进行快速搜索(少于 10 秒),最有可能在很短的时间内(10 - 30 分钟间隔)。我们还希望索引大部分数据点,以便我们可以快速搜索每个数据点。我们还希望在执行搜索时拥有最新的数据视图。留在开源世界会很棒,但我们不反对为这个项目寻找专有解决方案。
这个想法是保留大约一个月的数据,这将是大约 432 亿条记录。粗略估计,每条记录将包含大约 480 字节的数据,相当于一个月内约 18.7 TB 的数据,可能是索引的三倍。最终,我们希望增加该系统存储数万亿条记录的能力。
我们已经(非常基本地)评估了 couchbase、cassandra 和 mongodb 作为这个项目的可能候选者,但是每个人都提出了自己的挑战。使用 couchbase,索引是每隔一段时间完成的,而不是在插入数据期间完成,因此视图不是最新的,cassandra 的二级索引在返回结果方面效率不高,因为它们通常需要扫描整个集群以获取结果,而 mongodb 看起来很有希望但是由于它是主/从/分片,因此扩展似乎要困难得多。我们计划评估的其他一些候选者是 elasticsearch、mysql(不确定这是否适用)和一些面向列的关系数据库。任何建议或现实世界的经验将不胜感激。
NoSQL 和传统的 RDBMS 有什么区别?
在过去的几个月里,NoSQL 经常在技术新闻中被提及。与传统的 RDBMS 相比,它最重要的特征是什么?差异发生在什么级别(物理、逻辑)?
哪里是使用 NoSQL 的最佳场所?为什么?
在外键字段上的两个表之间进行循环引用是否可以接受?
如果没有,如何避免这些情况?
如果是这样,如何插入数据?
以下是(在我看来)可以接受循环引用的示例:
CREATE TABLE Account
(
ID INT PRIMARY KEY IDENTITY,
Name VARCHAR(50)
)
CREATE TABLE Contact
(
ID INT PRIMARY KEY IDENTITY,
Name VARCHAR(50),
AccountID INT FOREIGN KEY REFERENCES Account(ID)
)
ALTER TABLE Account ADD PrimaryContactID INT FOREIGN KEY REFERENCES Contact(ID)
Run Code Online (Sandbox Code Playgroud) 我原以为数据库会对它们经常遇到的事情有足够的了解,并且能够对它们所面临的需求做出响应,以便它们可以决定向高度请求的数据添加索引。
我们正在开发一个预付卡平台,该平台主要保存有关卡及其余额、付款等的数据。
到目前为止,我们有一个 Card 实体,它有一个 Account 实体的集合,每个 Account 都有一个 Amount,它在每次存款/取款时更新。
现在团队中有一场辩论;有人告诉我们,这违反了Codd 的 12 条规则,并且在每次付款时更新其价值很麻烦。
这真的有问题吗?
如果是,我们如何解决这个问题?
我目前的项目本质上是一个工厂文件管理系统的运行。
也就是说,有一些皱纹(惊喜,惊喜)。虽然有些问题是项目特有的,但我相信有一些普遍的观察结果和问题没有规范的答案(无论如何我可以找到)并且适用于更广泛的问题领域. 这里有很多,我不确定它是否适合 StackExchange Q&A 格式,但我认为它 a) 一个可回答的问题和 b) 不够具体,它可以使社区受益。我的一些考虑是特定于我的,但我认为这个问题对任何面临决定 SQL 还是 NoSQL 还是两者的人都有用。
我们正在构建的 Web 应用程序包含本质上具有明显关系的数据以及面向文档的数据。我们想吃蛋糕,也想吃。
TL;DR:我认为下面的 #5 通过了气味测试。你?有没有人有将 SQL 和 NOSQL 集成到单个应用程序中的经验?我试图在下面列出解决此类问题的所有可能方法。我错过了一个有前途的替代方案吗?
从本质上讲,它是关系数据(您的典型 Web 应用程序内容,如用户、组等,以及我们需要能够实时对复杂查询进行切片和切块的文档元数据)和文档数据(例如我们没有兴趣加入或查询的数百个字段 - 我们对数据的唯一用例将是显示输入的单个文档)。
我想对我的首选方法进行完整性检查(如果你检查我的发帖历史,我非常明确地说明我不是 DBA),并列举我遇到的所有选项供其他人解决涉及关系和非关系数据的广泛相似的问题。
1. 每个文档类一张表
每个文档类都有自己的表,其中包含所有元数据和数据的列。
好处:
缺点:
定义有点混乱 - 基本上我在问 SQL 是否是 NoSQl 系列的子集:
我问这个是因为“不仅”意味着 NoSQL 更大,但仍将 SQL 作为其中的一部分。
另一方面,由于我们无法在 NoSQL 数据库中执行典型的 sql 操作,例如连接,因此 SQL 不是 nosql 的一部分!
我想知道哪个是真的?
我像大多数开发人员一样使用索引(主要是……嗯!索引),但我确信有很多微妙的方法可以使用索引来优化数据库。我不确定它是否特定于 DBMS 的任何实现。
我的问题是:什么是如何使用索引的好例子(除了基本的、明显的情况),以及当您在表上指定索引时 DBMS 如何优化其数据库?
RDBMS 系统是否针对COMMIT操作进行了优化?ROLLBACK操作慢/快多少?为什么?
我想知道是否有任何好的解决方案可以在 NoSQL 数据库中记录数据,然后将它们转换为 RDBMS?
例如,如果您想快速捕获某些数据(如会话日志),但随后又希望能够针对这些数据创建报告。
我最喜欢的数据库是 Postgres,所以如果你的答案与 Postgres 相关,那就太好了。
rdbms ×10
nosql ×4
index ×2
mongodb ×2
cassandra ×1
foreign-key ×1
performance ×1
postgresql ×1
rollback ×1
sql-server ×1
transaction ×1