我正在考虑使用MongoDB来保存从100台摄像机录制的图像元数据,并且每台摄像机的记录将保留30天.如果一台摄像机每天提供100,000张图像,那么我将在MongoDB中以最大值保存(100 x 30 x 100000)个图像(文档).我的Web应用程序将查询此数据为:
选择摄像机>选择日期>选择小时>获取该小时内的所有图像.
我计划用以下三个选项设计模式,并需要您的专家意见/建议以获得最佳出路;
1)按小时收集:创建72000个MongoDB集合,即每个摄像机每小时收集1个(100个摄像机X 30天X 24小时)(使用--nssize 500命令超过24000个限制).我担心如果MongoDB允许我创建这么多的集合,其次是在阅读和写入这些集合时预期的性能优势和损失.虽然,对于每小时读取图像看起来非常容易使用此模式,因为我可以在单个查询中将数据提取到任何集合.
2)日常收藏:创建3000个MongoDB收藏,即每个摄像机每天1个收集(100个摄像机X 30天).虽然这是允许的,并且看起来收集的数量很多,但我关心的是从特定日期内的特定时间内阅读图像.
3)逐照摄像机集合:创建100个MongoDB集合,即每个摄像机1个集合(100个摄像机/集合).然后以(20141122061055000)格式保存具有唯一"id"的快照,这是对完整日期时间戳的重新描述(2014-11-22 06:10:55.000).
我希望,如果理想情况下我可以做(1),(2)或(3),但欢迎任何其他选择.
考虑到我的情况,请建议我对MongoDB的选择.
问候.
假设我有这样的结构
public class Form
{
public List<Field> Fields { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Field类可以是复合的,也包括从Field类派生的其他Fields ,所以我有一些层次结构.表单作为可靠文档保存到RavenDB中,它可以正常工作.我只是想知道Form从RavenDB 获取实例,我希望Raven创建适当的类(类,派生自Field类).所以,假设我有两个派生类FieldDerived1,FieldDerived2并将它们放入后面的Fields集合中,Form我希望有两个实际类型的元素 - FieldDerived1并且FieldDerived2我添加了这些类的所有附加属性?
如果您使用无模式数据库(特别是面向文档的数据库,如CouchDB,Couchbase,MongoDB)并希望更改特定对象的数据表示格式,则可以保留旧格式的现有记录并以新格式创建新记录.它被宣布为无模式数据库的主要优势之一(我认为因为你可以避免停机).另一方面,处理同类数据的许多格式是不方便和低效的.那么在无模式数据库中将数据从一种格式迁移到另一种格式的好方法/策略是什么?
data-migration document-oriented-db schemaless nosql couchbase
我已经很长时间没有从头开始创建一个项目,现在面向文档的数据库(以及ODM)已经变得非常流行,所以我必须在盲目地走向关系路线之前考虑它们.
任何人都可以尝试列出可能导致一种选择或另一种选择的动机/项目标准吗?
我正在阅读一篇关于MongoDB和CouchDB的文章,看到MongoDB可能会丢失数据,但CouchDB在某种程度上是稳定的,不可能丢失任何数据.
Redis和mongodb用户可能会有点惊讶地发现,默认情况下,如果进程崩溃或关闭,他们可能会丢失数据.
http://java.dzone.com/articles/should-i-use-mongodb-couchdb
有一种方法可以解决MongoDB中的这个问题,但我是否正确使用它:CouchDB更耐用,更稳定,没有任何配置?因此,如果CouchDB崩溃或者说在CouchDB系统的更新过程中炸弹会爆炸=>从来没有数据存储?
我只是想知道为什么.是因为CouchDB是用Erlang编写的吗?或者是因为CouchDB正在使用MVCC?有任何想法吗?谢谢
我只是想知道选择实施跟随系统的解决方案是什么?
在MySQL中我会有一个表
userID INT PRIMARY,
followID INT PRIMARY
Run Code Online (Sandbox Code Playgroud)
在Redis中,我只使用SET并将所有followID添加到UserID.
什么会更快,让我们说有2000个粉丝,你想列出所有的粉丝?(在一个有大约1M条目的表中)如果两个用户互相追随,会更快找到什么?
非常感谢你!
我打算将cassandra用作我的应用程序的nosql数据存储.我有一个使用案例是更新用户的"余额".假设每个用户的余额存储为密钥UID_balance.现在,如果我的应用程序想要更新多个用户的余额,我将如何处理原子性?
我想,在某些时候,应用程序基本上会执行以下操作:
1. for each user u
2. current_balance = read_users_balance(u);
3. new_balance = current_balance + delta_for_user(u);
4. write_users_balance(u, new_balance);
5. end
Run Code Online (Sandbox Code Playgroud)
现在,这里有几个问题:
RDBMS'解决了这些问题,因为它们提供ACID属性,而Cassandra则没有.我最近看到Cassandra(2012年10月)已经开始提供Atomic Batches.我不确定这是否是解决这个问题的正确方法.
这是我和朋友一起集思广益的事情.我们实际上并不更新用户的余额,而是创建一条记录,将更新增量附加到不同的记录.例如:
UID1_balance = {100}
UID1_deltas = {10,20,-40}
Run Code Online (Sandbox Code Playgroud)
为了获得当前的余额,我们只需将增量应用于余额.我们可以有一个脱机过程,将增量应用于用户的余额并修剪增量列表.
这个解决方案起作用并减少腐败状态的可能性,但我认为这是一种矫枉过正.有没有更好的方法来解决这个问题?
说我有一个集合allitems,每个文件都是表格
{_id: "1", items: [{number: 1, main: "how are you?", sub:[{id:1, item: "does it change with the day?", score: 0},{id:2, item:"some other question", score: 0}]}]}
Run Code Online (Sandbox Code Playgroud)
如何更新子项目的分数?
我试过了
db.allitems.update({_id:"1"}, {$set:{'items.0.sub.0.score': 5}});
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error: {
"$err" : "Unsupported projection option: items.0.sub.0.score",
"code" : 13097
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我想了解更好的EclipseLink NoSQL,但我无法理解它的局限性,它目前支持的内容,我根本无法找到有关团队未来计划的任何信息.
所以,简而言之,如果你不介意的话,我有很多我想知道的问题清单:
EclipseLink是否支持:
除了这些问题之外,我还应该知道还有其他任何限制或珠宝吗?此外,目前正在从事的团队是什么?未来的计划是什么?
如果有人在这里提供我上面提到的问题的链接或文档,我会非常高兴,因为我找不到任何东西:S
提前谢谢,佩德罗.