第一正規形への正規化

作成日: 2015-05-03
最終更新日:

課題

次の課題を解く。 下記の表がある。一行(1レコード)につき、B 列にはキーが、C 列から F 列までは非正規化状態でセルに非キーが入力されている。 これを第一正規形に正規化するにはどのようにすればよいか。 ここで、A 列は空欄であること、 少なくとも B 列 と C 列にはセルに値が入力されていること、 また C 列から F 列までは非キー値が左詰めで入力されていることは保証されているものとする。 なお、表は Excel で作られているものとする。また、表は太陽系に属する主な惑星と、その惑星に対する主な衛星である。

表 1 非正規化状態の表
ABCDEF
1 地球月       
2 火星フォボスダイモス    
3 木星ガニメデカリストイオエウロパ

解答

いくつかの方法を順序立てて組み合わせる。

シリアル値の入力

まず、A 列にシリアル値を入力する。A1 セルに 1 を、A2 セルに 2 を入れて A1:A2 を選択し、右下のフィルハンドルをダブルクリックすれば、 自動的に最終行まで連続したシリアル値が入力されるだろう。

表 2 シリアル値を入力した表
ABCDEF
11地球月       
22火星フォボスダイモス    
33木星ガニメデカリストイオエウロパ

空白レコードの作成

今度は空白レコードを作成する。 第 1 行から第 3 行までの A列の 1 から 3 までをコピーし、その下に3回ペーストする。 この 3 という数字は、繰り返し項目の最大値(ここではガニメデ、カリスト、イオ、エウロパの4)から1だけ差し引いた値である。

表 3 空白レコードを作成した表
ABCDEF
11地球月       
22火星フォボスダイモス    
33木星ガニメデカリストイオエウロパ
41            
52            
63            
71            
82            
93            
101            
112            
123            

シリアル値による並び替え

次に、A 列にあるシリアル値を昇順に並び替える。この結果により、1 レコードの下に繰り返し項目数 - 1 だけの空白レコードが用意される。 前項でわざわざ空白行を用意したのはこのためである。

表 4 シリアル値昇順に並び替えた表
ABCDEF
11地球月       
21            
31            
41            
52火星フォボスダイモス    
62            
72            
82            
93木星ガニメデカリストイオエウロパ
103            
113            
123            

主キーを連続して埋める

次に、B2 セルに =B1 と記述する。この結果、B2 セルは地球と表示される。 この B2 セルをコピーした状態で、B3 セルからB12 セルを選択状態にし、選択オプションを選ぶ。

このオプションで[空白セル]を選び、空白セルだけ活性化されたことを確認して、[貼り付け]を選ぶ。 すると、非キーの最大繰り返し数がキーになっていることがわかる。

表 5 主キーを連続して埋めた表
ABCDEF
11地球月       
21地球        
31地球        
41地球        
52火星フォボスダイモス    
62火星        
72火星        
82火星        
93木星ガニメデカリストイオエウロパ
103木星        
113木星        
123木星        

非主キーを連続して埋める

最後に、C2 セルに = D1 と記述する。この結果、C2 セルは0と表示される (仮に D1 に何か非主キーの値があれば、その値が表示される)。 この C2 セルをコピーした状態で、C2 セルから E12 セルを選択状態にし、選択オプションを選ぶ。

このオプションで[空白セル]を選び、空白セルだけ活性化されたことを確認して、[貼り付け]を選ぶ。 すると、非主キーの繰り返し項目がC列に代表してあらわれていることがわかる。

表 6 非主キーを連続して埋めた表
AB C D E F
11地球月       
21地球0  0  0    
31地球0  0  0    
41地球0  0  0    
52火星フォボスダイモス0    
62火星ダイモス0  0    
72火星0  0  0    
82火星0  0  0    
93木星ガニメデカリストイオエウロパ
103木星カリストイオ  エウロパ  
113木星イオ  エウロパ  0    
123木星エウロパ0  0    

後始末

B 列 と C 列は値と式が混在しているので値だけにすべく、B1からC12までをコピーして「値として貼り付け」を行う。 そのあと、C 列のセルが 0 となっている行をフィルターなどで選んでこれを消去すれば、B 列とC 列で第1正規化された表ができる。 この状態であれば、A 列 や、 D 列、E 列、 F 列を削除しても問題ない。 ここでは A 列を残しておき、D 列から F 列を削除した表を最終の形として掲げる。

表 7 第一正規形の表
AB C
11地球月   
22火星フォボス
32火星ダイモス
43木星ガニメデ
53木星カリスト
63木星イオ  
73木星エウロパ

課題の応用

次の課題を解く。 下記の表がある。 表 1 との違いは、非キーに従属データがついていることである。 一行(1レコード)につき、B 列にはキーが、C 列, D 列には衛星の名前とその衛星の公転周期 (単位:日)が入っている。 これを第一正規形に正規化するにはどのようにすればよいか。

表 8 非正規化状態の表
ABCDEFGHIJ
1 地球月   27.3217          
2 火星フォボス 0.3189ダイモス1.2624    
3 木星ガニメデ 7.1546カリスト16.6890 イオ 1.7691エウロパ 3.5512

シリアル値の入力、空白レコードの作成、シリアル値による並び替え、 主キーを連続して埋める、までは変わらない。 次の「非主キーを連続して埋める」ところが変わる。

先の例では従属データがない状態だったので C2 セルに = D1 と記述したが、この場合は従属データが一つあるので C2 セルに = E1 と記述する (なお、従属データが二つあれば C2 セルへは = F1 と記述する)。 次に C2 セルから H12 セルを選択状態にし、選択オプションを選ぶ。 以下は同じである。これでうまくいく理由は考えてほしい。

マクロにできるか

この作業はマクロにできるような気がするが、確かめていない。

参考リンク

なお、惑星・衛星の数値は、理科年表平成27年版、天文の部に記載されているものを使用した。

まりんきょ学問所コンピュータの部屋表計算ソフトの部屋 > 第一正規形への正規化


MARUYAMA Satosi