简体   繁体   English

3NF数据库规范化

[英]3NF Database Normalization

There is a report table for overdue DVD rentals. 有一个过期DVD租赁报告表。 The store has multiple copies of the same DVD (they are all numbered to be identified). 商店有同一张DVD的多个副本(它们都被编号以便识别)。 How can I normalize this data to meet 3NF requirements? 如何规范化此数据以满足3NF要求?

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

The data model: 数据模型:

VIDEO_ARTIST table VIDEO_ARTIST

  • ARTIST_ID , pk ARTIST_ID ,pk
  • FIRST_NAME
  • LAST_NAME

VIDEOS table VIDEOS

  • VIDEO_ID , pk VIDEO_ID ,pk
  • VIDEO_TITLE
  • ARTIST_ID , fk ARTIST_ID ,fk
  • RUNNING_TIME

VIDEO_COPIES table VIDEO_COPIES

  • VIDEO_COPY_ID , pk VIDEO_COPY_ID ,pk
  • VIDEO_ID , fk VIDEO_ID ,fk
  • VIDEO_COPY_NUMBER

Notice that I'm not using the primary key for the value displayed to the users. 请注意,我没有使用主键显示给用户显示的值。

  1. Copy numbers could change, but you don't want to break referencial integrity 复制数字可能会改变,但您不希望打破参照完整性
  2. Do not expose table keys 不要公开表键

VIDEO_RENTALS table VIDEO_RENTALS

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

VIDEO_RENTALS_ACCOUNTS table VIDEO_RENTALS_ACCOUNTS

  • ACCOUNT_ID , pk ACCOUNT_ID ,pk
  • ACCOUNT_NUMBER , unique ACCOUNT_NUMBER ,独一无二
  • FIRST_NAME
  • LAST_NAME

Same logic regarding the ACCOUNT_NUMBER as with the VIDEO_COPY_NUMBER ... 关于ACCOUNT_NUMBERVIDEO_COPY_NUMBER相同的逻辑...

Here's the SQL to use based on the data model to get the report example you provided: 以下是基于数据模型使用的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

Look at objects--actors: 看看对象 - 演员:

1. Customer
2. Title
3. Physical Medium (DVD, the thing you take home when borrowing)
4. Artist
5. Rental (act of renting = transaction)
  • One artist can author many titles (moves, albums); 一位艺术家可以创作许多标题 (动作,专辑); a title (album) can be performed by several artists . 一个标题 (专辑)可以由几位艺术家表演
  • One title can have many physical- media (dvd, tape, blue ray) copies; 一个标题可以有许多物理媒体 (DVD,磁带,蓝光)副本; a medium has one title only. 媒体只有一个标题
  • One medium (DVD) can be rented by many customers (one at the time); 一个媒体 (DVD)可以由许多客户租用(当时一个); a customer can rent many media (DVD). 客户可以租用许多媒体 (DVD)。 Media.Status tracks availability of a medium (DVD). Media.Status跟踪介质(DVD)的可用性。


rental_model_01

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM