我有一个我开发的网站,结构有点像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
表。我可以为每个都有一个多对多的映射表,也许还有其他一些我没有想过的解决方案。
什么是最好的?我对数据库设计知之甚少 - 这将是最灵活和最容易使用的?
答案 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
表更具语义性,因为它只包含有关图像的数据。
加入的成本不是一个大问题,因为我只在任何查询中返回少量图像。但是,我还没有测试过这两种方法的相对速度。