Sql 存储web应用程序的文件和注释。表格设计

Sql 存储web应用程序的文件和注释。表格设计,sql,database-design,web-applications,architecture,Sql,Database Design,Web Applications,Architecture,我有一个包含多个实体(表)的web应用程序,每个实体都有自己的CRUD页面 我想添加一些,添加评论和附加文件的能力 我在考虑两种情况 一个表用于所有注释/文件-该表将具有实体和特定记录的一些id 每个实体都有一个单独的注释/文件表 这些文件将存储在磁盘上的一个目录中。表中有文件名和一些附加信息。就应用程序设计而言,为所有内容提供一个唯一的表似乎是有意义的。就应用程序代码而言,这意味着相同的SQL将被所有实体重用。这是大多数应用程序使用的“经典方式”,它扩展了用于处理所有对象的注释和附件的相同活动

我有一个包含多个实体(表)的web应用程序,每个实体都有自己的CRUD页面

我想添加一些,添加评论和附加文件的能力

我在考虑两种情况

  • 一个表用于所有注释/文件-该表将具有实体和特定记录的一些id
  • 每个实体都有一个单独的注释/文件表

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

    就应用程序设计而言,为所有内容提供一个唯一的表似乎是有意义的。就应用程序代码而言,这意味着相同的SQL将被所有实体重用。这是大多数应用程序使用的“经典方式”,它扩展了用于处理所有对象的注释和附件的相同活动记录和控制器


    就SQL而言,第二种解决方案可以在一些数据库(如MySQL)中使用,以获得更多的内存缓存。第一个解决方案中添加的每个注释/附件都会从内存缓存中删除影响注释表的所有请求。对于单个表,对一个实体的注释不会使对其他实体的查询无效。但是您需要更多的文件描述符和更大的表缓存。。。。因此,要选择此解决方案,您需要根据真实、精确的案例做出决策,以便能够比较数据库访问速度方面的优势。当您添加新实体时,您肯定会发现您的each-entity-have-a-comment-table解决方案很无聊,使用第一个解决方案可以实现自动化。

    这是一个折衷方案。使用单注释表,您可以得到一个简单、干燥(不要重复自己)的模式,但不会得到外键约束,因此不会进行级联删除。因此,如果删除带有注释的实体,还必须记住删除注释

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

    DRY er模式的一个有趣的解决方案可能涉及表继承(请参阅),但请阅读第5.8.1节。注意事项,因为在索引方面存在一些“陷阱”,至少在postgres中是这样

    不管是哪种方式,都要感谢您仔细考虑数据库设计

    +1-不管它值多少钱(除非我有具体的理由不这么做),我会从选项一开始:没有坚实的理由,工程是没有意义的。