Web应用程序中数据库设计的提示

时间:2008-09-06 14:16:51

标签: database-design web-applications

是否有人对Web应用程序的数据库设计有任何提示/建议?当我正在处理的应用程序起飞并开始大量使用时,那些可以为我节省大量时间/精力的东西。

更具体一点,应用程序是一个策略游戏(基于浏览器,只是文本),主要涉及发布“订单”的玩家,这些订单将存储在数据库中并在以后处理,结果也存储在那里(“订单”的历史和相应的结果可能会相当大)。

已编辑添加更多详情(根据要求):

平台:Django

数据库引擎:我正在考虑使用MySQL(除非使用另一个有很大优势)

模式:我现在拥有的只是一些Django模型,这里发布的细节太多了。如果我开始发布模式,这变得太具体了,我正在寻找一般提示。例如,考虑我发布稍后将处理的“订单”并返回我必须存储的结果以显示某种“历史”。在这种情况下,最好是为“历史”设置一个单独的表,还是只聚合“订单”和结果?我想我可以缓存“历史”表,但是这会占用数据库中更多的空间以及更多的数据库操作,因为我必须不断创建新行而不是仅仅在聚合表中更改它们。

4 个答案:

答案 0 :(得分:10)

您可能已经触及了一个更大的设计问题,即高可扩展性和性能。

基本上,对于您的数据库设计,我会遵循良好的做法,例如向您希望经常使用的数据添加外键和索引,通过将数据拆分为更小的表来标准化您的数据并确定要经常读取的数据以及哪些数据应经常书写并优化。

比高性能Web应用程序的数据库设计更重要的是,您可以通过HTML页面缓存在客户端级别有效地使用缓存,在服务器级别通过缓存数据或提供静态文件来代替动态文件。

关于缓存的好处在于它可以根据需要添加,这样当你的应用程序确实起飞时,你就会相应地发展。

就您的历史数据而言,这是一个很好的缓存,因为您不希望它经常更改。如果您希望根据数据生成定期且相当密集的报告,那么最好将此数据放入另一个数据库,以免在运行时停止Web应用程序。

当然,除非您认为您的申请需要保证,否则这种优化确实没有必要。

答案 1 :(得分:3)

Database Normalization,并且对索引给予了很好的思考,这是你不能错过的两件事。特别是如果你考虑一个游戏,SELECTS比UPDATE更频繁地发生。

从长远来看,您还应该看看memcached,因为只要您拥有多个用户,数据库查询就会成为瓶颈。

答案 2 :(得分:1)

为什么不发布现有的架构?如果没有关于您将要使用的平台和数据库以及您提议的表格结构的详细信息,那么要回答这个问题是一个非常广泛的问题......

答案 3 :(得分:1)

如果您发现自己在一个查询中加入了6个以上的表来检索经常被点击的报告类型网页的数据,那么您应该非规范化您的表。此外,如果你使用像Hibernate或ActiveRecord这样的ORM库,请确保花费一些时间在它们生成的默认映射和最终生成的sql上。当你通过往返数据库获得相同的结果时,他们往往对数据库非常讨厌。