将表映射到许多其他表?

时间:2012-11-08 11:49:21

标签: sql database-design

我有一个我开发的网站,结构有点像stackoverflow。我在数据库中有一个Posts表和一个PostImages表。 PostImages表如下所示:

PostImageId PK
PostId      FK
Uri
MimeType

所以帖子可以有很多与之相关的图片。

我现在要求网站上的其他地方应该有图片:Users应该能够在其个人资料上显示图片,Categories应该能够拥有图片,{{1}应该能够有图像。

最好在我的数据库中只有一个Addresses表。我该如何塑造这个?我可以有一个这样的表:

Images

我可以有一个ImageId PK PostId FK CategoryId FK AddressId FK UserId FK Uri MimeType 表,然后是每种对象的额外表:

images

(每个项目的PK也是来自PostImageId PK FK PostId FK CategoryImageId PK FK CategoryId FK 表的图像的FK)

还有一些其他策略:例如,我可以为每种类型都有一个Images表,而没有共享___Images表。我可以为每个都有一个多对多的映射表,也许还有其他一些我没有想过的解决方案。

什么是最好的?我对数据库设计知之甚少 - 这将是最灵活和最容易使用的?

2 个答案:

答案 0 :(得分:1)

在现实生活中,数据库是针对数据可访问性的成本而设计的。您提到了两种设计表格的方法。两者都是正确的。如果将所有字段放在一个表中,则会出现数据冗余。如果你制作两张桌子就没有问题。

但是你必须记住,加入两张桌子会花费更多。因此,从服务器获取数据时,这可能会使您的页面变慢(如果同时有很多用户同时尝试)。

另一方面,如果将它放在一个字段中,则会在数据库中占用更多内存,但数据获取成本会降低。选择是你的。

答案 1 :(得分:1)

我选择了第二个选择。我有一个Images表:

Images
    ImageId    PK
    Name
    Uri
    Width
    Height
    MimeType

和几个映射表:

PostImages
    PostImageId      PK FK
    PostId           FK

CategoryImages
    CategoryImageId  PK FK
    CategoryId       FK

我更喜欢这个解决方案,因为我可以在不更改Images表的情况下添加更多映射表。它更容易维护。此外,它允许Images表更具语义性,因为它只包含有关图像的数据。

加入的成本不是一个大问题,因为我只在任何查询中返回少量图像。但是,我还没有测试过这两种方法的相对速度。

相关问题