我有几个实体(表格)的网络应用程序。每个实体都有他的CRUD页面。
我想补充一下,添加评论和附加文件的能力。
我在考虑两种情况。
文件将存储在目录中的磁盘上。表中将是文件的名称和一些其他信息。
答案 0 :(得分:2)
在应用方面,设计有一个独特的表适用于所有coments似乎是有道理的。在应用程序代码方面,意味着相同的SQL将被重用于所有实体。它是大多数应用程序使用的“经典方式”,延伸使用相同的acitive记录和控制器来处理所有对象的注释和附件。
在SQL方面,第二种解决方案在某些数据库(如MySQL)中非常有用,可以获得更多内存缓存的好处。第一个解决方案中添加的每个评论/附件都会从内存缓存中删除影响评论表的所有请求。对于单个表,对一个实体的注释不会使对其他实体的查询无效。但是你需要更多的文件描述符和更大的表缓存....所以要选择这个解决方案你需要根据现实,精确,案例做出决定,你可以在这里比较数据库访问速度的好处。当你添加新的实体时,你肯定会发现你的每个实体都有一个评论表解决方案,但是使用第一个解决方案可以实现自动化。
答案 1 :(得分:1)
这是一个权衡。使用单个注释表,您将获得一个简单的DRY(不要重复自己)模式,但是您没有获得外键约束,因此没有级联删除。因此,如果您删除带有注释的实体,您还必须记住删除注释!
如果您使用多个评论表,您将获得FK约束和级联删除,但您有一个“湿”架构(您正在重复自己)。例如,每个注释表可能都有一个commentbody列。如果更改该列定义,则必须在每个注释表中更改它!
DRY-er模式的一个有趣解决方案可能涉及表继承(请参阅http://www.postgresql.org/docs/9.0/interactive/ddl-inherit.html),但请阅读第5.8.1节。注意事项,因为关于索引有一些“陷阱”,至少在postgres中。
无论哪种方式,都要认真考虑您的数据库设计!