如何拆分oscars数据库中Oscars表为两张高效表并保存列至Series变量
拆分Oscars表为两张规范化表的方案
嘿,这是个很典型的数据库规范化需求——把包含重复维度信息和多值事实的单表拆分成一对多关联的两张表,既消除冗余又提升查询效率。
拆分思路
原Oscars表肯定存在重复的典礼属性(比如每届的年份、举办地点、主持人这些,每一条获奖记录都会重复存一遍),和多条获奖事实(每届有多个奖项/获奖者)。我们可以按照「维度表+事实表」的模式拆分:
维度表:Ceremonies(颁奖典礼信息)
保存每届奥斯卡的唯一核心属性,因为每年一届,所以每一行对应一届典礼,用唯一主键标识。
列定义(对应w4_table1):ceremony_id:主键(自增整数或用届数,比如第95届就存95),用于关联另一张表year:举办年份(比如2023)ceremony_number:届数(比如95)host:主持人姓名venue:举办场馆
事实表:AwardWinners(获奖记录)
保存每一个奖项的提名/获奖详情,每一行对应一个提名者/奖项,通过外键关联到Ceremonies表。
列定义(对应w4_table2):winner_id:主键(自增整数,唯一标识每一条提名记录)ceremony_id:外键,关联Ceremonies表的主键,标记这条记录属于哪一届category:奖项类别(比如「最佳影片」「最佳导演」)nominee:提名对象(影片名或人名)is_winner:布尔值,标记是否获奖winner_name:获奖者姓名(针对个人奖项,可选)
用Pandas Series保存表列
import pandas as pd # 维度表Ceremonies的列 w4_table1 = pd.Series( ['ceremony_id', 'year', 'ceremony_number', 'host', 'venue'], name='Ceremonies Table Columns' ) # 事实表AwardWinners的列 w4_table2 = pd.Series( ['winner_id', 'ceremony_id', 'category', 'nominee', 'is_winner', 'winner_name'], name='AwardWinners Table Columns' )
为什么这样更高效?
- 消除冗余:比如举办地点、主持人这些信息只存一次,不用在每条获奖记录里重复存储,节省存储空间
- 便于维护:如果某届的主持人信息需要修改,只需要更新Ceremonies表的一行,不用修改几十条获奖记录
- 查询更灵活:可以单独查询典礼信息,或者关联查询某届的所有获奖记录,性能更优
内容的提问来源于stack exchange,提问作者Joe Camphens
相关产品推荐
相关产品推荐

