【问题标题】:Store files and comments for a web application. Table design存储 Web 应用程序的文件和评论。餐桌设计
【发布时间】:2011-08-17 12:44:33
【问题描述】:

我有一个包含多个实体(表)的网络应用程序。每个实体都有他的 CRUD 页面。

我想添加一些添加 cmets 和附加文件的功能。

我在考虑两种情况。

  1. 所有 cmets/文件的一个表 - 表将具有实体和特定记录的一些 id。
  2. 对于每个实体都有一个单独的 cmets/files 表。

文件将存储在磁盘上的一个目录中。表中将包含文件名和一些附加信息。

【问题讨论】:

    标签: sql database-design web-applications architecture


    【解决方案1】:

    这是一个权衡。使用单个 cmets 表,您将获得一个简单的 DRY(不要重复自己)架构,但您不会获得外键约束,因此不会进行级联删除。因此,如果您使用 cmets 删除实体,您还必须记住删除 cmets!

    如果你使用多个评论表,你会得到 FK 约束和级联删除,但你有一个“湿”模式(你在重复自己)。例如,每个评论表可能有一个评论正文列。如果更改该列定义,则必须在每个评论表中更改它!

    DRY-er 模式的一个有趣解决方案可能涉及表继承(请参阅http://www.postgresql.org/docs/9.0/interactive/ddl-inherit.html),但请阅读第 5.8.1 节。注意事项,因为至少在 postgres 中存在一些关于索引的“陷阱”。

    无论哪种方式,感谢您仔细考虑您的数据库设计!

    【讨论】:

      【解决方案2】:

      在应用程序设计方面,为所有评论提供一个独特的表格似乎是有意义的。就应用程序代码而言,这意味着所有实体都将重用相同的 SQL。这是大多数应用程序使用的“经典方式”,扩展为具有用于处理所有对象的 cmets 和附件的相同活动记录和控制器。

      就 SQL 而言,第二种解决方案在 MySQL 等一些数据库中可能很有用,以获得更多 内存缓存 好处。在第一个解决方案中添加的每个评论/附件都会从内存缓存中删除所有影响评论表的请求。对于单个表,对一个实体的评论不会使对其他实体的查询无效。但是您还需要更多的文件描述符和更大的表缓存......所以要选择这个解决方案,您需要根据真实的、精确的案例做出决定,您可以在其中比较数据库访问速度的好处.当您添加新实体时,您肯定会发现每个实体都有一个注释表的解决方案很无聊,使用第一个解决方案可以使事情自动化。

      【讨论】:

      • +1 - 对于它的价值(除非我有特定的理由不这样做)我会从选项一开始:没有充分的理由就没有工程的意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2011-03-26
      • 2012-09-24
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多