2

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

标准化 http://img193.imageshack.us/img193/7804/normalization.jpg

4

2 回答 2

10

数据模型:

VIDEO_ARTIST桌子

  • ARTIST_ID, PK
  • FIRST_NAME
  • LAST_NAME

VIDEOS桌子

  • VIDEO_ID, PK
  • VIDEO_TITLE
  • ARTIST_ID, f
  • RUNNING_TIME

VIDEO_COPIES桌子

  • VIDEO_COPY_ID, PK
  • VIDEO_ID, f
  • 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_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
于 2009-11-11T02:57:14.190 回答
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) 的可用性。


出租模型_01

于 2009-11-11T02:47:13.970 回答