实现n-to-m关系的正确方法

时间:2010-05-17 08:25:50

标签: sql database postgresql

这是我数据库结构的一部分:

Table: Item
Columns: ItemID, Title, Content, Price

Table: Tag
Columns: TagID, Title

Table: ItemTag
Columns: ItemID, TagID

Table: Image
Columns: ImageID, Path, Size, UploadDate

Table: ItemImage
Columns: ItemID, ImageID

这些项目可以有多个图像,所以我有一个额外的表格“图像”,并将这些图像映射到一个项目。我现在看到这个结构存在问题。在我添加图像之前,我必须输入一个项目。

我的问题是现在。这个结构是一个很好的方法来解决我的问题与一个项目的许多图像/标签?

谢谢

4 个答案:

答案 0 :(得分:4)

是的,这是通常的做法。为此目的完全规范化的DB结构。

根据您的应用程序,某些时候可能需要某种非规范化来帮助提高性能,但我会等到您确定实际的瓶颈之后。

确保所有外键和您通常过滤的任何其他字段都有索引。在ItemTagItemImage上制作综合索引也是一个好主意。

答案 1 :(得分:1)

这是一个很好的结构。映射表通常是实现多对多关系的最简单方法。

您可以在没有项目的情况下将图像自由添加到Image表中。如果您正在构建项目,向其中添加图像,那么您可以选择如何实现此项目:

  1. 在用户编辑时,将内存中的项目和关联的图像对象创建为非持久对象。用户完成后,项目及其图像将保留。
  2. 让用户先添加图像,然后从这组图像中创建项目。
  3. 创建一个新项目(带有新ID)并在用户构建时构建它。如果用户选择取消,则您必须删除该项目。如果仅为此项目创建图像,则可能还必须删除图像。
  4. 我会选择(1) - 可能会为你做更多的工作但是你会得到一个更易理解和更一致的系统。

答案 2 :(得分:0)

是的,有效。

在您的设置中:

项目有很多图片

项目拥有并且属于许多标签

图片有一个项目

标签包含并属于许多项目

答案 3 :(得分:0)

  

我的问题是现在。这是结构   一个解决我的问题的好方法   一个项目的许多图像/标签?

多对多关系为应用程序增加了大量复杂性。如果你确实需要那么多的复杂性,我会重新考虑。例如,您可以将图像信息存储在项目表中。复制路径并不昂贵。