3NF数据库规范化

时间:2009-11-11 01:38:09

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

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

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

2 个答案:

答案 0 :(得分:10)

数据模型:

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. 不要公开表键
  3. VIDEO_RENTALS

    • VIDEO_COPY_ID,pk,fk
    • ACCOUNT_ID,pk,fk
    • DUE_DATE,pk

    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
    

答案 1 :(得分:3)

看看对象 - 演员:

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


rental_model_01