【问题标题】:How to structure SQL data model to maintain data integrity如何构建 SQL 数据模型以维护数据完整性
【发布时间】:2020-08-04 11:03:03
【问题描述】:

背景

我正在建立私人厨师预订服务,您可以在其中预订厨师为您烹制自定义菜单。我在创建准确表示域同时保持数据完整性的 SQL 数据库架构时遇到了问题。

要求

  • 客户通过选择ChefMenu 来创建Booking,并为每个MenuCourse 选择他们想要的MenuItems
  • Chef 定义了一组MenuItem,客户可以从中选择以创建他们的Booking
  • MenuMenuCourses 的集合。 (例如,名为“品尝菜单”的Menu 是 6 道菜的餐点,每道菜的价格在 10-20 美元之间,MenuCourse)。
  • Chef 应该能够将其MenuItems 与多个MenusMenuCourses 相关联。
  • 客户Booking 应包含所选客户的Chef 以及将要服务的Menu(和MenuItems)。 Booking 价格由 MenuMenuCourse 选择决定(开胃菜的价格低于主菜)

问题

在我当前的数据模型中,我有以下不知道如何解决的问题:

A.可以使用Chef“A”创建一个Booking,但随后有一个BookingMenuItem 使用Chef“B”引用MenuItemBooking 的所有BookingMenuItem 应该属于一样的Chef)

B. Booking 引用了特定的 Menu(我需要定价,定价基于 MenuMenuCourse)但是 BookingMenuItemBooking 可以引用完全不同的 Menu 或 @987654362 @

是否可以重新设计我的数据库架构来解决我遇到的完整性问题?还是我只需要在应用程序级别实施这些检查。谢谢!

【问题讨论】:

  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图像中包含图例/键和说明。只提供您需要的东西并将其与您的问题联系起来。
  • 你是说一旦有人和 Nigella Lawson 一起预订芝士蛋糕,就再也没有人可以和其他厨师一起预订芝士蛋糕了?
  • @Nick.McDermaid 不,每个厨师都定义了自己的菜单项,客户可以根据他们在预订中选择的厨师来预订他们想要的任何东西......厨师可以是不同客户多次预订
  • 关于问题 A,您似乎应该从 MenuItem 中删除 chef_id。您可以通过遍历连接到Booking 来计算出特定厨师预订了哪些菜单项,反之亦然。关于问题 B,这是因为顾客可能会预订套餐菜单,还是他们可能会从个别项目中预订自定义菜单?

标签: sql database database-design database-schema data-modeling


【解决方案1】:

这使用模型中的表名,并尽可能接近它。我将menu_item 重命名为dish,以避免混淆。


customer {CST}
     KEY {CST}
chef {CHF}
 KEY {CHF}
dish {CHF, DSH_NO}
 KEY {CHF, DSH_NO}

FK {CHF} REFERENCES chef {CHF}
menu {CHF, MNU_NO}
 KEY {CHF, MNU_NO}

FK {CHF} REFERENCES chef {CHF}
menu_course {CHF, MNU_NO, CRS_NO}
        KEY {CHF, MNU_NO, CRS_NO}

  FK {CHF, MNU_NO} REFERENCES
menu {CHF, MNU_NO}
menu_course_item { CHF
                 , MNU_NO
                 , CRS_NO
                 , CRS_ITM_NO
                 , DSH_NO
                 }
KEY {CHF, MNU_NO, CRS_NO, CRS_ITM_NO}

        FK1 {CHF, MNU_NO, CRS_NO} REFERENCES
menu_course {CHF, MNU_NO, CRS_NO}

 FK2 {CHF, DSH_NO} REFERENCES
dish {CHF, DSH_NO}
booking { CST
        , BOOK_NO
        , CHF
        , MNU_NO
        }
    KEY {CST, BOOK_NO}
     SK {CST, BOOK_NO, CHF, MNU_NO}

FK1 {CST} REFERENCES customer {CST}

 FK2 {CHF, MNU_NO} REFERENCES
menu {CHF, MNU_NO}
booking_menu_item { CST
                  , BOOK_NO
                  , CHF
                  , MNU_NO
                  , CRS_NO
                  , CRS_ITM_NO
                  }

KEY {CST, BOOK_NO, CHF, MNU_NO, CRS_NO, CRS_ITM_NO}

    FK1 {CST, BOOK_NO, CHF, MNU_NO} REFERENCES
booking {CST, BOOK_NO, CHF, MNU_NO}

             FK2 {CHF, MNU_NO, CRS_NO, CRS_ITM_NO} REFERENCES
menu_course_item {CHF, MNU_NO, CRS_NO, CRS_ITM_NO}

我使用通用术语KEY 表示PK or AK。如果出于某种原因,您需要使用单列技术密钥 (xx_ID),请确保添加它们,如 this example 中所述;如果不是,所有这些KEY 都是PK

注意:

All attributes (columns) NOT NULL

KEY = PK or AK

PK = Primary Key
AK = Alternate Key   (Unique)
SK = Proper Superkey (Unique)
FK = Foreign Key

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 2021-09-21
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2012-02-22
    • 2010-09-24
    相关资源
    最近更新 更多