【问题标题】:3NF Database Normalization3NF 数据库规范化
【发布时间】:2010-12-15 07:25:59
【问题描述】:

有一个过期 DVD 租借的报告表。该商店有同一张 DVD 的多个副本(它们都被编号以便识别)。如何标准化这些数据以满足 3NF 要求?

Normalization http://img193.imageshack.us/img193/7804/normalization.jpg

【问题讨论】:

  • 如果是这样,请标记为[作业]。
  • 这有点像一个家庭作业问题:您希望我们为您完成您的工作吗?也许如果你展示了你到目前为止所做的事情,以及你坚持的事情,人们会更愿意提供帮助。
  • 根据样本数据,毫无疑问这是一道作业题。

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


【解决方案1】:

看对象——演员:

1. Customer
2. Title
3. Physical Medium (DVD, the thing you take home when borrowing)
4. Artist
5. Rental (act of renting = transaction)
  • 一个艺术家可以创作许多标题(动作、专辑);一个标题(专辑)可由多个艺术家演唱。
  • 一个标题可以有许多物理媒体(dvd、磁带、蓝光)副本; 媒体只有一个标题
  • 许多客户可以租用一张medium (DVD)(一次一张); 客户可以许多媒体 (DVD)。 Media.Status 跟踪媒体 (DVD) 的可用性。


【讨论】:

    【解决方案2】:

    数据模型:

    VIDEO_ARTIST

    • ARTIST_ID,PK
    • FIRST_NAME
    • LAST_NAME

    VIDEOS

    • VIDEO_ID,PK
    • VIDEO_TITLE
    • ARTIST_ID,fk
    • RUNNING_TIME

    VIDEO_COPIES

    • VIDEO_COPY_ID,PK
    • VIDEO_ID,fk
    • VIDEO_COPY_NUMBER

    请注意,我没有使用主键作为向用户显示的值。

    1. 副本号可能会更改,但您不想破坏参考完整性
    2. 不要暴露表键

    VIDEO_RENTALS

    • VIDEO_COPY_ID, pk, fk
    • ACCOUNT_ID, pk, fk
    • DUE_DATE,P​​K

    VIDEO_RENTALS_ACCOUNTS

    • ACCOUNT_ID,PK
    • ACCOUNT_NUMBER,独一无二
    • FIRST_NAME
    • LAST_NAME

    ACCOUNT_NUMBERVIDEO_COPY_NUMBER 的逻辑相同...

    以下是根据数据模型使用的 SQL 来获取您提供的报告示例:

    SELECT v.video_title 'Video Title',
           aa.artist_name 'Artist',
           vc.video_copy_number 'Copy Number',
           v.running_time 'Length',
           vr.due_date 'Date Due',
           acct.borrower_name 'Borrower',
           acct.account_number 'Card Number'
      FROM VIDEO_RENTALS vr
      JOIN VIDEO_COPIES vc ON vc.video_copy_id = t.video_copy_id
      JOIN VIDEOS v ON v.video_id = vr.video_id
      JOIN (SELECT a.artist_id,
                   a.firstname +' '+ a.lastname AS artist_name
              FROM ARTIST a) aa ON aa.artist_id = vr.artist_id
      JOIN (SELECT vra.account_id,
                   vra.account_number,
                   vra.firstname +' '+ vra.lastname AS borrower_name
              FROM VIDEO_RENTALS_ACCOUNTS vra) acct ON acct.account_id = vr.account_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      相关资源
      最近更新 更多