2

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

PostImageId PK
PostId      FK
Uri
MimeType

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

我现在有要求网站上的其他地方应该有图像:Users应该能够在他们的个人资料Categories中拥有图像,应该能够拥有图像,并且Addresses应该能够拥有图像。

似乎最好在我的数据库中只有一个Images表。我应该如何建模?我可以有一个这样的表:

ImageId    PK
PostId     FK
CategoryId FK
AddressId  FK
UserId     FK
Uri
MimeType

我可以有一个images表,然后每种对象都有额外的表:

PostImageId      PK FK
PostId           FK

CategoryImageId  PK FK
CategoryId       FK

(其中每个项目的PK也是Images表中图像的FK)

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

什么是最好的?我对数据库设计知之甚少——哪个最灵活、最容易使用?

4

2 回答 2

1

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

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

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

于 2012-11-08T12:05:46.247 回答
1

我选择了第二个选择。我有一张Images桌子:

Images
    ImageId    PK
    Name
    Uri
    Width
    Height
    MimeType

和几个映射表:

PostImages
    PostImageId      PK FK
    PostId           FK

CategoryImages
    CategoryImageId  PK FK
    CategoryId       FK

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

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

于 2013-05-03T16:58:21.327 回答