为什么我应该使用像CouchDB这样的基于文档的数据库而不是使用关系数据库.是否存在基于文档的数据库比关系数据库更适合的典型应用程序或域?
我正在创建一个系统,使用SNMP以(可能)5分钟的间隔轮询设备以获取有关各种指标的数据,例如CPU利用率,磁盘利用率,温度等.最终目标是以时间序列图的形式为系统用户提供可视化.
我已经看过了,在过去使用的RRDTool,但拒绝了它作为存储捕获的数据无限地将我的项目很重要,我想更高层次和更灵活的访问捕获的数据.所以我的问题是:
什么是更好的关系数据库(如MySQL或PostgreSQL)或非关系数据库或NoSQL数据库(如MongoDB或Redis)在查询数据进行图形处理时的性能.
给定一个关系数据库,我将使用一个data_instances表,其中将存储为所有设备测量的每个度量捕获的每个数据实例,并包含以下字段:
领域: id fk_to_device fk_to_metric metric_value timestamp
当我想在特定设备上绘制特定指标的图形时,我必须查询此单个表,过滤掉其他设备,以及为此设备分析的其他指标:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Run Code Online (Sandbox Code Playgroud)
此表中的行数为:
d * m_d * f * t
Run Code Online (Sandbox Code Playgroud)
其中d是的数量的装置,m_d是累计度量的数目被记录为所有设备,f是频率在其中数据被轮询和t是总量时间系统已收集数据.
对于一年中每5分钟记录3个设备的10个度量标准的用户,我们将有不到500万条记录.
没有索引fk_to_device并且fk_to_metric扫描这个不断扩展的表将花费太多时间.因此,索引上述字段以及timestamp(用于创建具有本地化期间的图表)是必需的.
MongoDB具有集合的概念,与表不同,这些可以在没有设置的情况下以编程方式创建.有了这些,我可以为每个设备划分数据存储,甚至为每个设备记录每个指标.
我没有使用NoSQL的经验,也不知道它们是否提供任何查询性能增强功能,例如索引,但是前一段提出在数据存储在NoSQL下的结构中进行大多数传统的关系查询工作.
具有正确索引的关系解决方案是否会在一年内减少爬行?或者NoSQL方法的基于集合的结构(与我存储的数据的心智模型相匹配)是否提供了明显的好处?
database time-series non-relational-database relational-database nosql
我知道有三种不同的,流行的非SQL数据库类型.
我已经阅读了很多关于它的博客而没有那么多了解.
我知道关系数据库,并掌握基于文档的数据库,如MongoDB/CouchDB.
有人能告诉我这些与名单上的两位前者之间的主要区别是什么?
我知道像MySQL,PostgreSQL和MS SQL Server这样的解决方案是关系数据库系统,NoSQL,MongoDB等是非关系型DBMS.
但是,这两种系统有什么区别?
Layman条款是优选的.
谢谢.
我正在学习传统的关系数据库(使用PostgreSQL)并进行一些研究我遇到了一些新类型的数据库.CouchDB,Drizzle和Scalaris仅举几例,下一个要处理的数据库技术是什么?
我正在尝试学习OLAP和数据仓库,我对关系和维度建模之间的区别感到困惑.维度建模基本上是关系建模,但允许冗余/非标准化数据?
例如,假设我有(产品,城市,#销售)的历史销售数据.我理解以下是关系的观点:
Product | City | # Sales Apples, San Francisco, 400 Apples, Boston, 700 Apples, Seattle, 600 Oranges, San Francisco, 550 Oranges, Boston, 500 Oranges, Seattle, 600
虽然以下是更具维度的观点:
Product | San Francisco | Boston | Seattle Apples, 400, 700, 600 Oranges, 550, 500, 600
但似乎两种观点仍然可以在相同的星型模式中实现:
Fact table: Product ID, Region ID, # Sales Product dimension: Product ID, Product Name City dimension: City ID, City Name
直到你开始向每个维度添加一些额外的细节,差异才会开始出现.例如,如果您也想跟踪区域,关系数据库往往会有一个单独的区域表,以便保持所有规范化:
City dimension: City ID, City Name, Region ID Region dimension: Region ID, Region …
database database-design non-relational-database relational-database
我一直在使用关系数据库,但最近才发现必须有其他类型的非关系型数据库.
什么是非关系数据库的例子,以及它们在现实世界中的使用位置和方式?为什么要选择在关系数据库上使用非关系数据库?
编辑:答案中提到了另外两个类似的问题:
假设以下"模式/关系"设计,使用级联删除操作删除处理删除的推荐做法是什么?
关系模式:
+---------+ +--------+ | Student |-*--------1-[Enrollment]-1--------*-| Course | +---------+ +--------+
MongoDB的:
+---------+ +--------+ | Student |-*----------------*-| Course | +---------+ +--------+
考虑到学生的课程招生的这一经典设计,具有学生,反之亦然课程集合似乎使用MongoDB的(即没有为关系/报名表)时是合适的数据模型.但是来自关系世界我应该如何处理删除课程的语义?也就是说,当删除课程时,也应删除所有"注册"记录.也就是说,我应该从每个学生记录的集合中删除该课程.看起来我必须触发2个查询:一个用于删除课程,然后从每个学生的集合中删除它.有没有办法让单个查询执行这种"级联删除",如语义而无需额外的查询?数据模型是否需要更改?
注意:对于所有其他用例,上述数据模型工作正常:
=>只会删除该学生以及随之删除的相关课程集.=>的学生只需将其从学生课程集中删除即可=>只是将其添加到相应的"表格"中.唯一棘手的事情是处理删除课程.我应该如何处理MongoDB中的这种情况,因为我来自关系背景,我无法弄清楚这一点.
database database-design non-relational-database mongodb cascading-deletes
我是数据库的新手,我从未使用过任何RDBMS.但是我得到了关系数据库的基本概念.至少我想我做;-)
假设我有一个用户数据库,每个用户都有以下属性:
- 用户
- ID
- 名称
- 压缩
- 市
在关系数据库中,我将在一个名为的表中对其进行建模user
- 用户
- ID
- 名称
- LOCATION_ID
并有一个名为的第二个表 location
- 地点
- ID
- 压缩
- 市
并且location_id是location表中条目的外键(引用).如果我理解正确的优势就在这里,如果某个城市的邮政编码发生变化,我只需要改变一个条目.
那么,让我们去非关系型数据库,在那里我开始使用Google App Engine.在这里,我真的会对它进行建模,就像它在规范中首先写下来一样.我有一种user:
class User(db.Model):
name = db.StringProperty()
zip = db.StringProperty()
city = db.StringProperty()
Run Code Online (Sandbox Code Playgroud)
优点是我不需要加入两个"表",但缺点是,如果邮政编码改变,我必须运行一个遍历所有用户条目并更新邮政编码的脚本,对吗?
因此,现在Google App Engine中还有另一个选项可供使用ReferenceProperties.我可以有两种:user和location
class Location(db.Model):
zip = db.StringProperty()
city = db.StringProperty()
class User(db.Model):
name = db.StringProperty()
location = db.ReferenceProperty(Location)
Run Code Online (Sandbox Code Playgroud)
如果我没错,我现在拥有与上述关系数据库完全相同的模型.我现在想知道的是,首先,我所做的是错误的,这会破坏非关系型数据库的所有优点.我明白,为了获得zip和城市的价值,我必须运行第二个查询.但在另一种情况下,要对邮政编码进行更改,我必须运行所有现有用户.
那么这两种建模可能性在Google数据存储区等非关系数据库中的含义是什么呢?它们的典型用例是什么,这意味着何时我应该使用一个,另一个使用何时.
另外作为一个额外的问题,如果在非关系数据库中我可以建模与关系数据库中的模型完全相同的模型,为什么我应该使用关系数据库呢?
很抱歉,如果其中一些问题听起来很幼稚,但我相信他们会帮助一些对数据库系统不熟悉的人,以便更好地理解.
google-app-engine data-modeling non-relational-database relational-database
我正在开始一个Web应用程序,将可伸缩性作为首要任务之一.这有什么好处:cassandra scala lift
与云上的传统LAMP相比?从我所读到的,请纠正我,云本身是可扩展的
我以前从未见过有人在云上部署scala.学习平台是否值得付出努力?它准备好用于生产吗?
database ×6
couchdb ×2
mongodb ×2
nosql ×2
cassandra ×1
cloud ×1
redis ×1
relational ×1
scala ×1
scalability ×1
sql ×1
time-series ×1