【发布时间】:2011-07-23 10:55:31
【问题描述】:
通常情况。我有一个简单的应用程序,可以让人们上传照片并关注其他人。结果,每个用户都会有类似“墙”或“活动源”的东西,他或她可以在其中看到从他/她的朋友(他或她关注的人)上传的最新照片。
大部分功能都很容易实现。但是,当涉及到这个历史活动提要时,由于纯粹的性能原因,事情很容易变得一团糟。
我在这里遇到了以下困境: 我可以轻松地将活动提要设计为数据库的规范化部分,这将节省我的写作周期,但在为每个用户选择这些结果时会大大增加复杂性(对于在特定时间段内上传的每张照片,选择一定数量,我关注的上传者/对于我关注的每个人,选择他的照片)
一个优化选项可以是引入一系列阈值约束,例如,允许我根据他们上次上传的日期对我关注的人进行排序,甚至排除一些人,以节省周期,以及每个用户,仅选择 5(例如)最后上传的照片。
第二种方法是为活动提要引入一个完全非规范化的架构,其中每一行都代表我的一个关注者的通知。这意味着每次我上传照片时,数据库都会在这个“drop bucket”中放入 n 行,n 表示我关注的人数,即大量的写作周期。不过,如果我有这样的表,我可以轻松应用一些优化技术,例如智能索引,以及修剪超过特定时间段的条目(队列)。
然而,我想到的第三种方法甚至是一种非规范化程度较低的模式,其中服务器端应用程序将从数据库中移除部分复杂性。我看到一些社交应用程序,例如friendfeed,严重依赖于数据库中JSON 对象等序列化对象的存储。
我肯定还在掌握可扩展数据库设计的技能,所以我确信我错过了很多东西,或者仍然需要学习。如果有人能给我指出正确的方向,我将不胜感激。
【问题讨论】:
-
我不太擅长数据库优化,但您可能需要一个非 SQL 数据库(看看 Cassandra 和 MongoDB)。实际上,在那种情况下,它们似乎真的更快。 (想想 facebook,使用 cassandra 作为主要 dbms :D)
-
有没有关于设计可扩展数据库(用于社交应用和 MMO)主题的好书?
-
只是想知道,除了可扩展的数据库和数据检索之外,您在设计此类应用程序时是否遇到任何其他问题..您选择哪种框架、语言来开发此类应用程序。 ..实际上我问过类似的问题:- stackoverflow.com/questions/4842276/…
标签: mysql database database-design query-optimization scalability