3NF数据库规范化

Isr*_*ANY 2 sql database database-design data-modeling normalization

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

规范化http://img193.imageshack.us/img193/7804/normalization.jpg

OMG*_*ies 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. 不要公开表键

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_NUMBER作为与VIDEO_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
Run Code Online (Sandbox Code Playgroud)