2011-05-03 51 views
1

我有一个Web应用程序与几个实体(表)。每个人都有他的CRUD页面。存储Web应用程序的文件和注释。表设计

我想添加一些,添加注释和附加文件的能力。

我在想两种情况。

  1. 所有注释/文件的一个表 - 表中将有一些实体和特定记录的ID。
  2. 对于每个实体一个单独的评论/文件表。

这些文件将存储在磁盘上的一个目录中。表中将文件的名称和一些额外的信息。

回答

1

这是一个折衷。使用单一评论表,您会得到一个简单的DRY(不要重复自己)模式,但不会获得外键约束,因此不会级联删除。因此,如果您删除带有评论的实体,则还必须记得删除评论!

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

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

无论哪种方式,对您的认可思考您的数据库设计的荣誉!

2

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

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

+0

+1 - 对于它的价值(除非我有其他特定的理由),我会从选项一开始:没有坚实的理由,没有工程没有意义。 – 2011-05-04 03:55:22