【问题标题】:Database structure: how to best design for this issue?数据库结构:如何最好地设计这个问题?
【发布时间】:2023-04-11 07:48:01
【问题描述】:

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

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

到目前为止,我有以下表格:

对象:id、名称

项目:ID、名称

assigned_items:id、object_id、item_id、数量

图片:id、object_id、item_id

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

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

【问题讨论】:

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


    【解决方案1】:

    看看这个模型:

    它允许您:

    • 将多个项目连接到多个对象(感谢 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
    

    【讨论】:

      【解决方案2】:

      除非您实际上意味着项目可以属于多个对象,否则使用assigned_items 没有帮助。如果我的理解正确,您主要关心的是有时您的图片是商品的一部分,那么您如何描述图片?

      这是我的建议:

      对象: id、名称

      ITEM:id、名称、数量、object_id

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

      如果您的 DBMS 支持约束,则对 IMAGE 设置一个约束以强制执行 object_id 或 item_id 中的一个或另一个(但不能同时执行两者)。这使您可以将图像定义为一个项目或整个对象。

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

      【讨论】:

      • 谢谢您的回答...我不明白的是,如果图像不是分配给项目而是分配给对象本身怎么办?与图像中的对象没有关系,是吗?好像没有项目,我无法将图像分配给任何东西......
      • @Chris - 我已经更新了我的答案,以适应您评论中的其他信息。
      • 是的,这是个好主意,乔尔.. 但是,现在您在项目和图像中都有 object_id... 这正是我不想使用它的原因.. 谢谢不过,为你努力! :)
      • @Chris - 我不明白你的担忧是什么。您需要 ITEM 中的 object_id,因为否则无法知道哪些项目属于哪些对象。您在 IMAGE 中同时拥有 item_id 和 object_id,但您只能使用其中一个,具体取决于图像适用于什么。没有办法用更少的列或更少的冗余来表示您声称需要的信息。请解释为什么您认为我的回答有问题。您接受的答案比我建议的更复杂且容易出错。请告诉我座位如何适用于多辆车?
      • 如果您在项目和图像中有 object_id,对我来说似乎并不完全多余。但我猜布兰科的意思是与这些关系的附加表。我喜欢这个解决方案,因为现在我有了图像:id、assigned_to(例如 0=object、1=item)、assigned_id(object_id 或 item_id,取决于 assign_to 值)。然后其他表是 OBJECTS、ITEMS 和 ITEMS_ASSIGNED(ITEMS 和 OBJECTS 之间的关系,因为对象可以有任意数量(也可以有多个)项目)......您对此有何看法?无论如何,为您的所有努力+1!再次感谢您!
      猜你喜欢
      • 2013-03-14
      • 2011-10-07
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2011-05-12
      • 2012-06-03
      • 2021-03-17
      相关资源
      最近更新 更多