我真的很想使用 SimpleDB,但我担心如果没有真正的锁定和事务,整个系统就会存在致命缺陷。我知道对于高读/低写应用程序来说这是有意义的,因为最终系统会变得一致,但是中间的时间呢?似乎不一致的数据库中的正确查询将以一种很难追踪的方式对整个数据库造成严重破坏。希望我只是一个担心疣......

有帮助吗?

解决方案

这是一致性和可扩展性以及(在某种程度上)可用性之间的非常经典的战斗。有些数据并不总是需要那么一致。例如,查看 digg.com 以及某个故事的挖掘数量。值很可能在“digg”记录中重复,而不是强制数据库对“user_digg”表进行联接。如果这个数字不完全准确,有什么关系吗?可能不会。那么使用 SimpleDB 之类的东西可能是一个不错的选择。但是,如果您正在编写银行系统,您可能应该首先重视一致性。:)

除非您从第一天起就知道必须处理大规模问题,否则我会坚持使用简单的更传统的系统,例如 RDBMS。如果您在具有合理商业模式的地方工作,那么当流量大幅上涨时,您将有望看到收入大幅上涨。然后你可以用这笔钱来帮助解决扩展问题。扩展是困难的,扩展也很难预测。大多数对您造成伤害的扩展问题都是您从未预料到的。

我宁愿让一个网站起步,花几周时间在流量增加时解决规模问题,然后花太多时间担心规模问题,以至于我们永远不会将其投入生产,因为我们的钱用完了。:)

其他提示

假设你正在谈论这个SimpleDB的,则又不是作为一个杞人忧天;有真实的理由不使用它作为一个真实世界中的DBMS。

这是你从交易获得支持DBMS中的属性,可以通过首字母缩写“A.C.I.D.”缩写:原子性,一致性,隔离性和持久性。 A和d,多有与系统崩溃的事,和C和我有规律运做。他们是与商业数据库时所有事情的人完全理所当然的,所以如果你有一个数据库的工作,没有他们中的一个或更多,你可能会为任意数量的讨厌的惊喜的是

<强>原子性:任何交易将要么完全充分或完全不(即,它会提交或中止干净)。这适用于单个语句(如“UPDATE表...”),以及更长,更复杂的交易。如果没有这一点,那么任何出现问题(比如,磁盘快满了,电脑崩溃等)可能会留下一些做了一半。换句话说,你不能永远依靠DBMS真正做的事情,你告诉它,因为任何数量的真实世界的问题可以得到的方式,甚至一个简单的UPDATE语句可能会部分完成。

一致性:您已经设置了关于数据库的任何规则总是会被执行。就像,如果你有一个规定说一个总是等于B,再没有什么人做的数据库系统可以打破规则 - 它会失败,尝试任何操作。这是不是很重要的,如果所有的代码是完美的......但实际上,当是有史以来的情况?另外,如果你错过了这个安全网,事情变得很恶心的,当你失去...

隔离:在数据库上采取的任何行动,因为如果他们连续发生(一次一个)将执行,即使在现实中他们同时发生(相互交错)。如果多个用户将在同一时间打这个数据库,你没有这个,接下来的事情你甚至无法想到会出问题;甚至原子语句可以在不可预见的方式彼此交互和搞砸。

耐久度:如果你失去动力或软件崩溃,会发生什么是正在进行中的数据库事务?如果你有耐久性,答案是“没有什么 - 他们都是安全的”。数据库通过使用一种叫“撤销/重做日志”,在这里你尽到数据库的每一件小事首先在某种程度上,这样你可以在发生故障后重建当前登录状态(通常为安全单独的磁盘)做到这一点。如果没有,上面的其他属性有几分没用,因为你永远无法100%肯定,事情会在崩溃后保持一致。

做任何这些东西怎么了你?答案有一切跟你做交易类型,并要在失败的情况下什么保证。有可能是案件(如只读数据库),你不需要这些,但只要你开始做任何事情无小事,和一些不好的事情发生,你会希望你有“时间。也许这是OK的,你只是恢复到备份随时意想不到的事情发生,但我的猜测是,事实并非如此。

另外请注意,删除所有这些保护措施并不能使它一个给定的,你的数据库将会有更好的表现;事实上,它可能是相反的。这是因为现实世界的数据库管理系统软件还具有万吨代码的优化的查询性能。所以,如果你写一个查询,连接上SimpleDB的6张桌子,不要以为它会找出最佳的方式来运行的查询 - 你可能最终等待小时才能完成,当一个商业DBMS可以使用索引散列连接,并把它以.5秒。有数不胜数的小技巧,你可以做优化查询PERFORMANCE,相信我,你真的很想念他们时,他们已经走了。

这一切都不是指作为SimpleDB的爆震;把它从软件的笔者:“虽然这是一个伟大的教学工具,我不能想象有人会想用它做别的事情。“

scroll top