数据库结构:如何针对这个问题进行最佳设计?

时间:2012-03-17 20:30:21

标签: database database-design relational-database database-schema database-normalization

我的用户有多个对象,可以上传这些对象的图像。每个对象都有几个项目。用户上传的照片可以分配给这些项目。问题是,一个对象可以多次拥有一个特定项目。

举个例子:物品是汽车,物品是座位,窗户,门等。汽车可能有5个座位,但所有座位都是同一个项目。但是,图像的描述仍应是“座位1”,“座位2”等,用户也可以为座位2上传多张图像。

直到现在我有以下表格:

对象:id,name

项目:id,name

assigned_items :id,object_id,item_id,数量

图片:id,object_id,item_id

您最好如何解决这个问题?

我使用数量的原因是,因为如果项目的类型发生变化,那么很可能是所有项目。例如。 4个座位可以变成4个轮子等等。所以,如果每个assigned_item都有一排,让我们说seat1,seat2,seat3等等,那么这将更难改变,不是吗?

2 个答案:

答案 0 :(得分:1)

除非您实际意味着项目可以属于多个对象,否则使用assigned_items无效。如果我理解正确,你主要担心的是你有时会有一些项目的图像,那么你如何描述图像呢?

以下是我的建议:

OBJECT: id,name

ITEM: id,name,quantity,object_id

IMAGE: id,name(null),object_id(null),item_id(null)

如果您的DBMS支持约束,请对IMAGE进行约束以强制执行object_id或item_id(但不是两者)中的一个或另一个。这允许您将图像定义为项目或整个对象。

当您查询图像的名称时,您将使用COALESCE函数(或您的DB的等效函数)来获取图像覆盖名称(如果存在)或对象/项目名称(如果覆盖不是存在)。

答案 1 :(得分:1)

看看这个模型:

enter image description here

它允许您:

  • 将多个项目连接到多个对象(感谢OBJECT_ITEM表)。
  • 将同一项目多次连接到同一个对象(感谢OBJECT_ITEM.POSITION字段)。
  • 将多个图像连接到对象项连接(感谢OBJECT_ITEM_IMAGE表)。因此,我们连接到连接,而不是直接连接到项目。
  • 为特定于对象项连接的图像命名(感谢OBJECT_ITEM_IMAGE.IMAGE_NAME字段),而不仅仅是特定于图像。
  • 确保每个对象项连接的图像名称是唯一的(由于UNIQUE约束“U1”)。

注意:如果OBJECT:ITEM关系为1:N而不是M:N,则可以简化此模型,但您自己的尝试模型似乎表明它是M:N。

注意:要将图像直接连接到OBJECT(而不是OBJECT_ITEM),您需要在“OBJECT和IMAGE”之间的其他链接表(OBJECT_IMAGE)。


示例数据:

OBJECT:
    Car

ITEM:
    Seat

OBJECT_ITEM:
    Car-Seat-1
    Car-Seat-2
    Car-Seat-3
    Car-Seat-4
    Car-Seat-5

OBJECT_ITEM_IMAGE:
    Car-Seat-1-Image1 "Seat1 Image"
    Car-Seat-2-Image1 "Seat2 Image"
    Car-Seat-2-Image2 "Seat2 Alternate Image"
    Car-Seat-3-Image1 "Seat3 Image"
    Car-Seat-4-Image1 "Seat4 Image"
    Car-Seat-5-Image1 "Seat5 Image"

IMAGE:
    Image1
    Image2