- PR -

レコード毎に複数のカテゴリを保持させる場合のテーブル設計方法

1
投稿者投稿内容
Ier
常連さん
会議室デビュー日: 2006/02/23
投稿数: 33
投稿日時: 2007-04-25 22:55
現在、複数のブログからRSSを元に記事を取得し、取得した記事のデータをデータベースに保存するといったプログラムを組んでいます。
1つの記事に対してカテゴリは複数存在するため、
記事の情報をDBに保存する際に、記事のカテゴリをどうやって保存すればよいか悩んでいます。

+---------------+
記事表
-----------------
記事ID
...略...
記事カテゴリ
-----------------

+---------------+
カテゴリ表
-----------------
カテゴリID
カテゴリ名
-----------------

記事テーブルのレコード数は将来かなりの量になると思われます。
1つの記事に対して複数あるカテゴリを保存するためにはどのようにするのがベストなのでしょうか?
今までに思いついた設計は以下の2つなのですが、ご指摘よろしくお願いします。

@:
 [記事表] の [記事カテゴリ] 列にカンマ区切りで[カテゴリ表] の [カテゴリID] を保持させる
 1,4,9,12


A:
 [記事表] の [記事ID] と [カテゴリ表] の [カテゴリID] を複合主キーとして持つ [記事カテゴリ表] を作成する
+---------------+
記事カテゴリ表
-----------------
記事ID
カテゴリID
-----------------
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-04-25 23:30
引用:

Ierさんの書き込み (2007-04-25 22:55) より:
 [記事表] の [記事カテゴリ] 列にカンマ区切りで[カテゴリ表] の [カテゴリID] を保持させる
 1,4,9,12


これは、第1正規化すらできていないテーブルの使い方(繰り返し(オカレンス)がある)になり、リレーショナルDBとしての使い方ではありません。

引用:

Ierさんの書き込み (2007-04-25 22:55) より:
 [記事表] の [記事ID] と [カテゴリ表] の [カテゴリID] を複合主キーとして持つ [記事カテゴリ表] を作成する


これは「多対多」テーブルを使ったやりかたであり、リレーショナルDBとしての典型的な使い方です。便宜的に、オカレンスを持ったままにするというDB設計もあるとは思いますが、これはもはやリレーショナルDBとしての使い方ではなく、たんにテキストファイルの代わりにDBを使っているんだ、ぐらいの意気込みで扱わないといずれ破綻をきたします。

リレーショナルDB(RDB)をあくまでも「リレーショナル」なものとして使うならば、多対多でやるしかありません。ただし、扱うテーブルが増えますので、スクラッチプログラミングでは使いにくいとも言えます。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-26 00:00
unibonさんの仰るとおりなわけですが、

[カテゴリ表]は必ずしも必要というわけではないです。
[記事表]と[記事カテゴリ表]のみでも実現できます。

[カテゴリ表]は[記事カテゴリ表.カテゴリ名]をDISTINCTしたものに
人工キーを振っただけのテーブルですし。

もちろん、他に[カテゴリ表]を参照するテーブルが無ければの話です。

[追記]
+---------------+
記事カテゴリ表
-----------------
記事ID
カテゴリ名
-----------------
とした場合、と書いておいた方がわかりやすいですね。
[/追記]

[ メッセージ編集済み 編集者: あしゅ 編集日時 2007-04-26 00:11 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-04-26 00:25
N:Nの関係になる場合、個人的には2番目の方法を好みます。ただし複合キーにはせず、サロゲートキーをつけます。
即ち、
+---------------+
記事カテゴリ表
-----------------
記事カテゴリID (主キー)
記事ID (外部キー)
カテゴリID (外部キー)
-----------------
とします。

T字型ER手法の世界では、これを対照表と言うそうです。
Ier
常連さん
会議室デビュー日: 2006/02/23
投稿数: 33
投稿日時: 2007-04-26 01:10
unibonさん、あしゅさん、かずくんさん。
返信ありがとうございました。
二番目の方法でいこうと思います。

> [記事表]と[記事カテゴリ表]のみでも実現できます。
現状では複数の記事が共通のカテゴリを持つこともあるため、
カテゴリ名が重複しないためにもカテゴリ表を作っている状態です。
こういった場合の重複[カテゴリ]は許されるものなのでしょうか?

> T字型ER手法の世界では、これを対照表と言うそうです。
勉強になります。ありがとうございました。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-26 01:36
引用:

Ierさんの書き込み (2007-04-26 01:10) より:
現状では複数の記事が共通のカテゴリを持つこともあるため、
カテゴリ名が重複しないためにもカテゴリ表を作っている状態です。
こういった場合の重複[カテゴリ]は許されるものなのでしょうか?



このやり方をお勧めしているわけではないですので、参考までに。

複数の記事が共通のカテゴリを持つことを許容するのですよね?
[記事表]がなければ、カテゴリ名の重複検査はそもそも不要です。

追記のところに書いた[記事カテゴリ表]は、
記事IDと「カテゴリ名」で複合主キーとする構造になっています。

RSSの<category>は記事を書いた人が勝手に設定する名前なので、
マスタを作って維持管理する必要性は高くないと思ったからです。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-04-26 12:06
引用:

あしゅさんの書き込み (2007-04-26 01:36) より:
追記のところに書いた[記事カテゴリ表]は、
記事IDと「カテゴリ名」で複合主キーとする構造になっています。

RSSの<category>は記事を書いた人が勝手に設定する名前なので、
マスタを作って維持管理する必要性は高くないと思ったからです。



ちょっと抽象的なことを言えば、「カテゴリ」を独立した「エンティティ」として認識するか、記事エンティティの単なる「属性」として認識するかに依存するということなのでしょう。

モデル化の対象領域をどのような世界観で理解するのかにより、どちらも正解になり得ます。
1

スキルアップ/キャリアアップ(JOB@IT)