2017-06-13 14 views
0

我从一张表格列出了1958年至1980年的前100首歌曲。对于每个日期,有100个记录。很明显,很多歌曲会在每周更改位置时重复。此外,艺术家将多次重复(想想猫王)。表中有约116,000条记录。了解正常化和重复 - 我猜我不 - 添加艺术家和标题ID

此表有以下字段

uniq, 
date, 
artist, 
title, 
position 

消除重复(正常化据我所知)我已经修改了表,以便它现在看起来像这样

uniq, 
date, 
artistcode, 
titlecode, 
position 

,有两个新表艺术家和标题。 艺术家看起来像这样

artist, 
artistcode 

和标题看起来像这样

title, 
titlecode 

要在正确的方向开始,我只是想重组(合并)这些表,让我有一个视图看起来像原始表,即

uniq, 
date, 
artist, 
title, 
position 

并有那些116000条记录。在阅读了几本书并参考了几篇教程之后,我得出结论:我对正常化应该做什么存在误解,或者我只是朝着错误的方向前进。

SQL语法创建视图将不胜感激。

+0

该视图很容易回答。请尽可能清楚地说出你的意思是“重复”,你看到他们有什么问题,以及你认为“正常化”的含义。 (似乎“消除重复”意味着用关联的ID替换“重复”,似乎问题可能是“需要[原文]数据压缩”。) – philipxy

+0

不幸的是,这是两个完全不同的问题。 (你的头衔和你的最后一行 - 即使他们分享其余大部分内容。)(如果你单独发布他们,这会有所帮助。)很高兴你看到了你的观点(你可以接受amflare的答案)重复“和”正常化“? – philipxy

回答

1

要回到与多个表的原始输出,可以使用下面的语法与JOINs

SELECT s.uniq, s.date, a.artist, t.title, s.position 
FROM songs AS s 
JOIN artists AS a ON a.artistcode = s.artistcode 
JOIN titles AS t ON t.titlecode = s.titlecode 

如果你想消除重复的歌曲条目,你可以将它添加到查询:

GROUP BY t.title 
+0

添加该组是无效的,因为所选列不是每个标题的单值。 – philipxy

+0

我不确定你的意思是“单值”,但是使用s.titlecode代替它可能会修复它。 – amflare

+0

Mysql要求SELECT语句中的所有项目也出现在GROUP BY语句中,除非sql_mode =''(或其他一组模式)。 当我想通过它时,包含GROUP BY子句中的所有字段是有意义的 –

1

什么“重复”? There is nothing wrong per se with the same value appearing multiple times.你需要开始阅读一些关于information modeling and relational databases的学术课本/幻灯片/课程。

表中或表中的每一行都表明了有关情况的说明。 有时多行同一个表格说的情况相同的东西有时出现normalization地址出现的那种“重复”和“冗余”的问题。 (其中可能涉及或可能不涉及多次出现的子值)。

例如:如果您有一个像这样的表,但有一个额外的列和给定的艺术家/标题组合,总是出现在该列中具有相同的值就好像一个艺术家从来没有多次使用同一个标题制作的录音,并且您添加了每个录制的播放时间),那么就会出现问题。 (“... AND recording artist/title is time minutes long”)如果你有一个像这样的表,但有一个额外的列和一个值,它总是以相同的艺术家/标题组合出现(就像你添加了一个录音ID一样),那么会出现问题。 (” ...和记录recordingcode是标题标题的艺术家艺术家“)现在是没有问题的。你有什么期望作为一个答案呢?答案是,正常化说没有问题,和你的印象不被通知正常化。

Normalization does not involve replacing values by ids.介绍ID值具有完全相同的外观,因为它们识别/替换值相同的模式,这样就不会“消除重复”,并增加了更多的新表的ID的“复制品”。The original table as a view is a projection of a join of the new tables on equality of ids. (你可能希望有更易于更新或压缩数据的id(等),代价是更多表&连接(等)。这是一个单独的问题。)

-- hit `uniq` is title `title` by artist `artist` at position `position` on date `date` 
/* FORSOME h.*, a.*, t.*, 
    hit h.uniq is title with id h.titlecode by artist with id h.artistcode 
     at position h.position on date h.date 
AND artist a.artist has id a.artistcode AND h.artistcode = a.artistcode 
AND title t.title has id t.titlecode AND h.titlecode = a.title 
AND `uniq` = h.uniq AND `title` = t.title AND `artist` = a.artist 
    AND `position` = h.position AND `date` = h.date 
*/ 
/* FORSOME h.*, a.*, t.*, 
    Hit(h.uniq, h.titlecode, h.artistcode, h.position, h.date) 
AND Artist(a.artist, a.artistcode) AND h.artistcode = a.artistcode 
AND Title(t.title, t.titlecode) AND h.titlecode = a.title 
AND `uniq` = h.uniq AND `title` = t.title AND `artist` = a.artist 
AND `position` = h.position AND `date` = h.date 
*/ 
create view HitOriginal as 
select h.uniq, h.date, a.artist, t.title, h.position 
from Hit h 
join Artist a on h.artistcode = a.artistcode 
join Title t on h.titlecode = t.titlecode 
+0

不知道我关注。如果我在排行榜日期中列出了前100首歌曲,则随着歌曲在图表上向上或向下移动,相同的歌曲/歌手组合将出现多次。 你是正确的,一个简单地替换一首歌的编号并没有做太多的工作,但是这样做是否更容易,例如更新艺术家的拼写? 假设我拼写错误的甲壳虫。通过为艺术家使用id并将其与一系列歌曲相关联,我可以通过更新一条记录来修正披头士的拼写。 –

+0

是“相同的歌曲/艺术​​家组合将出现多次”。 *那么是什么?*(请参阅我的答案和链接。)如需更具体的答案,请编辑您的问题以明确说明“重复”,如果您认为问题具体。减少印象。要知道什么时候和为什么有设计问题,你需要一本教科书,因为解释是复杂*。例如阅读并应用规范化章节。 PS是的,你可能想要有易于更新(等)的ID,而牺牲更多的表和连接(等)。但你不需要。这与正常化无关。 – philipxy

相关问题