頼むから正規化しろよ 第二正規形

このエントリーをはてなブックマークに追加
235NAME IS NULL:2009/12/26(土) 01:44:47 ID:dn/wTtyt
ニコニコ動画のコメントやアマゾンのレビュー、youtubeのコメントなど
1対多の関係はどういうデータベースの構造になっているんでしょうか?
自分は以下の3パターンを考えたのですがどれも疑問が残ります。

案1:1つのレコードに動画番号とその動画に対する全てのコメント番号を収納する
動画1, コメント1コメント2コメント3コメント4
動画2, コメント1コメント2
欠点:・コメント数が有限になってしまうのではないか。
   ・複数のコメントが一つのコラムに収納されている場合、
    1つのコメントの追加によってそのフィールド全体を更新しないといけないから
    重いのではないか。

案2:コメント主導で動画番号を対応づける
コメント1, 動画1
コメント2, 動画2
コメント3, 動画1
コメント4, 動画3
欠点:動画を見る度にコメントの抽出をしないといけないから重いのではないか

案3:各動画毎にコメント用のテーブルを用意する
動画1のコメントテーブル:
コメント1
コメント2
コメント3
動画2のコメントテーブル:
コメント1
欠点(?):動画の数だけテーブルを用意することになるけど、
    自分はどうプログラミングするのか分からないです。
236NAME IS NULL:2009/12/26(土) 02:51:10 ID:rKp6qWLp
>>235
リレーショナルデータベースでのデータ設計は、プログラム言語のように構造体で
カタチを決めて配列やリスト構造を持たせていくデータ設計と違って、集合論理と
関連の概念で解決しないとダメなんだよ。

↓こんな風に持たせればそれらしくなるんじゃない?
237NAME IS NULL:2009/12/26(土) 02:51:56 ID:rKp6qWLp
【投稿動画テーブル】
 動画ID   会員ID     投稿日時      動画データ ・・・
---------+----------+---------------+----------+---
sm1234567 nv1000000 2008/10/21 11:25 mov999999 ・・・
sm1234568 nv1300000 2009/01/13 18:31 mov888888 ・・・
sm1234569 nv2000000 2009/07/02 09:05 mov989898 ・・・
sm1234510 nv1000000 2009/12/25 23:41 mov010101 ・・・
   :        :         :           :

【投稿コメントテーブル】
 動画ID  タイム  コメント
---------+-----+-----------------
sm1234567 00:01 wktk
sm1234567 00:03 高画質
sm1234568 01:52 ああああああああ
sm1234567 00:08 テラ画質w
sm1234567 00:12 キター!
sm1234510 00:02 w
   :      :     :
sm1234567 01:32 これはすごいな
sm1234567 01:40 たしかにw
sm1234569 03:02 おおおおおおおおっ!
sm1234567 01:59 うp主様、乙でした
238NAME IS NULL:2009/12/26(土) 02:52:50 ID:???
そもそもRDBかどうかも疑うべきだと思うけど。
239NAME IS NULL:2009/12/26(土) 03:21:23 ID:dn/wTtyt
>>237
ありがとうございます。
つまりそれは案2で、動画を見る度に
全てのコメントを収納した巨大な投稿コメントテーブルから
動画IDでコメントの抽出を行うんですよね?
それって重くないんでしょうか。
案3だと抽出処理が要らないんで軽いのかと思ったんですが
そんな大差はないのかな。。
240NAME IS NULL:2009/12/26(土) 04:06:02 ID:???
>>239
案ずるには及ばないと思うよ。インデックスとサーチのアルゴリズムは高度だから。
この程度のデータなら、RDBMSで数万件からの抽出でも、あっという間な筈。

あと他の方法となれば、制限を設けて自前のアルゴリズムで管理するしかないね。
WindowsならVC++やVC#、VBなどでサービスプログラムを組んで、Webページの
サーバーサイドから呼ぶとかね。
ハッシュアルゴリズムとか独自方式とか好きな技法でカスタムメイドできるよ。
241NAME IS NULL:2009/12/26(土) 19:20:41 ID:???
>>238
ニコニコはMYSQLだと聞いてる。
242NAME IS NULL:2009/12/26(土) 22:13:20 ID:???
>>238
現実的に考えて、RDB以外にないだろ。
243NAME IS NULL:2009/12/27(日) 00:06:26 ID:???
多くの工業科&組込制御系育ちはRDBMSをなかなか理解できないらしい。
自分をCPUに見立てたプログラム実行ロジックで考えてしまう癖が抜けなくて、
データの順番や個数、アドレス問題はポインタで解決済みの早見表として
オンメモリですべてを掌握していないと納得できないという。

役割分担や分散処理が苦手で、すべて自分のプログラムだけでやろうとする。
そして孤高だったりする。
244NAME IS NULL:2010/01/20(水) 21:17:11 ID:X+55Zxtj
>>242
動画番号に対して固定長(古いコメントは消えるので)のコメント領域を返すkey-valueじゃだめ?
245NAME IS NULL:2010/01/21(木) 08:45:08 ID:???
>>244
現時点のいろんな意味で、その実装に
もっとも適しているのがRDBだろ。

246NAME IS NULL:2010/01/21(木) 18:56:38 ID:???
>>245
non-Relationalなkey-valueで済むなら、そのほうがスケーラビリティとかパフォーマンスで有利では。
247NAME IS NULL:2010/01/21(木) 20:03:46 ID:???
それだと重くならないかとか・・・、固定長の領域を返せばとか・・・って、ちょっと違うんじゃね?

なぜ動画投稿コミュニティサイトのような規模のシステム全体を、同じCPUとメモリの配下で
動作する単一のプログラムやプロセスとして考えるんだよ。スレ的にも当然RDBMSを使い、
サブシステムごとに分散処理だろw
248NAME IS NULL:2010/01/22(金) 04:17:32 ID:???
結構昔だけどYouTubeなんかはBigTable使い始めたってどっかで読んだ。
249NAME IS NULL:2010/01/22(金) 15:53:53 ID:???
>>247
>同じCPUとメモリの配下で動作する単一のプログラムやプロセスとして考える
何のことを言ってるのかちょっと分かんないです><
250NAME IS NULL:2010/04/09(金) 23:50:09 ID:???
4月1日からDBの仕事するようになって1週間だが、早くもタイトル通りの叫び声あげたくなった。
これが現場のDBって奴なのか……
251NAME IS NULL:2010/04/14(水) 18:37:37 ID:???
既存なら泣く
設計中なら正規化を押し通せ
252NAME IS NULL:2010/04/15(木) 05:02:26 ID:???
設計は完全に終ってる。
既にシステムの一部は稼働していて、リリースまでに間に合わなかった機能を実装している段階だ。
253NAME IS NULL:2010/04/23(金) 15:29:57 ID:???
自分の視野が世界の全て病
254NAME IS NULL:2010/07/07(水) 22:36:04 ID:/39YW+Cp
正規化について勉強を始めたのですが
一人の人に複数の趣味のフィールドを持たせたい場合は
どうするべきでしょうか
shumi1,shumi2のようなカラムを作るのは非正規と理解しています。
趣味のテーブルを分けて、shumi_idという外部キーでやるとした場合

name shumi
kiteretu 1
kiteretu 2

の様に重複するフィールドが出てくるので正規化はされていない
と思っています。どうすればよいのか教えてください。
255NAME IS NULL:2010/07/07(水) 23:10:47 ID:???
第4正規形になるね。
正規形を崩すかBCNFにしてFKで整合性を取るかじゃないかな
256NAME IS NULL:2010/07/08(木) 12:20:56 ID:???
>>254
普通に第二正規形ではない。例えばリレーションpersonが以下の
ようであるとして、

person(person_id, name, gender, shumi_id)

で仮に一人の人が複数の趣味を持つとすると、このリレーション
の候補キーは(person_id, shumi_id)になる。
でもnameやgender(性別)といった非キー属性はperson_idにだけ
関係従属する。

person_id -> name
person_id -> gender

テーブルの候補キーに完全関数従属していないので非第二正規形。
これを第二正規形にするには、部分従属する非キー属性nameと
genderを別のリレーションに分ける。

person(person_id, shumi_id) 候補キーperson_id, shumi_id
person2(person_id, name, gender) 候補キーperson_id

まぁ実際は後者のリレーション名をpersonにして前者は
person_shumiとかにすると思うけれどもね。
257NAME IS NULL:2010/07/08(木) 21:10:32 ID:???
>>255
>>256
ありがとうございます。
なんとか理解できそうなので、続けてサンプルを見まくります。
258Perl忍者 ◆M5ZWRnXOj6 :2010/09/03(金) 17:24:39 ID:zlBbPnBj
web土方でSQLもろくに使えねえし設定もできねえし
正規化もろくにできてねえし
お前ばかなの?しぬの?
っていったら

得意気に黒い画面だして ポストグレ起動して手動でinsertやりまくって追加してた

脳味噌がかわいそうだった

かわいそすぎて泣いた
259NAME IS NULL:2010/09/14(火) 03:05:12 ID:???
>>258
何を言っているのかよくわかりません。
あなたもかわいそうな人に見えます。
260NAME IS NULL:2010/10/28(木) 15:47:02 ID:???
5年くらい昔であろうか?
有名なSlerが受注した外資系企業のシステムで開発者を200人以上集めた。
Oracleのバージョンは忘れた。

既にメンバーからはずれた人が設計したという500列だったかの
ワークテーブルなるのものがあって、正規化した各テーブルから
データをかき集めてワークテーブルでまとめて更新。

新たに参加したメンバーは必ずこの仕様ではプログラムは書けない、
ワークテーブルも削ろう、と進言したが、現テーブル設計担当は
ぐずぐずしているだけでまったく動かず。

動的SQLを多用しないとプログラムを書けず、当然プログラム・バグが
多発。残業・徹夜してもバグの原因がなかなかわからず。

結局、社長命令でシステム開発は中止。
改めて開発予算を確保してテーブル設計からやり直すことに。

得るものは何もない、むなしい仕事だった。
テーブル設計担当を大雪山に生き埋めにしてやりたかった。

正規化は大切だぞ。
261NAME IS NULL:2010/10/28(木) 23:36:12 ID:???
>>260
ああ、解るわー。

その500列を作った技術者は、コボラーじゃないか?
あと列の名前も意味の無いコードで定義されていたりした?

コボラーにテーブル設計をやらせては駄目だよな。
262NAME IS NULL:2010/10/29(金) 02:16:04 ID:???
物理名は英字+数字の連番な
263NAME IS NULL:2010/11/09(火) 02:22:59 ID:???
アラフォーCガリガリプログラマなんだけど、担当者が逃げたASP.NETのシステムを
見ることになってそのままDBの勉強始めたんだけど、DBってこんなに面白かったんだね
正規化とか考えてると楽しい
DBの講習会とか「興味ない」とサボってたのを後悔した

ただSQLはつまらんね
なんでこう、表示、更新、追加でこんなに文法違うんだよ
考えたやつ、頭おかしいだろ
264NAME IS NULL:2010/11/09(火) 02:28:31 ID:???
COBOL文化の人って、CHAR型好きだよね。
枝番 … EDA CHAR(2) とか。

あと制約付けるのが嫌いで、FETCHが好き。
265Perl忍者 ◆M5ZWRnXOj6 :2010/11/12(金) 17:39:54 ID:LqoipeIo
正規化してないバカが作ったやつのWEBアプリが
すべてそのままデータぶち込んでてプライマリーすらわかってねーみたいで
頭おわってんなっておもったわ

SQLも理解できないカスグラマも世の中たくさんいるしな
WEBバカはかすばっかりだよ
とくに3キモ言語使ってるやつらな
266NAME IS NULL:2010/11/13(土) 08:35:08 ID:???
一方で、DWH見て「ぜんぜん正規化とか理解してない、これ設計したのコボラだろwww」
みたいなこと言う奴もいたりするけどな。
267NAME IS NULL:2010/11/13(土) 18:03:03 ID:???
>>266
オレの事か?

本気でコボラーにはテーブル設計して貰いたくないと感じてる。
268NAME IS NULL:2010/11/13(土) 18:43:10 ID:WUzshbar
>>267
何もわかってないw
269NAME IS NULL:2010/11/13(土) 21:52:14 ID:???
「コボラー」よりRDBをわかっているというのが唯一の自慢な人は所詮そんなもんw
270NAME IS NULL:2010/11/13(土) 23:05:36 ID:???
DWHってなんぞやと検索したら納得

>>267
何もわかってないww
271NAME IS NULL:2010/11/14(日) 23:37:21 ID:???
いやいやいや!
DWHは、正規化が完了してから正規化崩しを行っていくんだろ。

コボラーの奴は、正規化が不完全な状態から正規化崩しを行うからgdgdなテーブル設計になるんだって。
272NAME IS NULL:2010/11/15(月) 00:29:36 ID:???
もっと流れよめ
273NAME IS NULL:2010/11/15(月) 02:12:21 ID:???
頭が悪いのに付ける薬はないってことだ
274NAME IS NULL:2010/11/15(月) 08:06:17 ID:???
>>271
マジレスすると、DWHではそのような方法はとらない。
そもそも正規化というのが更新異常を防ぎデータの一貫性を保つための考え方である以上、
個々に更新を行わず、ETLであらかじめ一貫性を整えたデータを一括してロードするDWHには
必要のないもの。
275NAME IS NULL:2010/12/12(日) 00:35:52 ID:???
性器化の意義:項目間の相関性を極小にし記憶効率を改善する。性器化のしすぎは
多くの場合検索性を損ね、時には信頼性も下げる場合がある。

非性器化の意義:項目間の従属性を許可する。記憶効率は下がるが、多くの場合に
検索性が向上し、時には信頼性が向上する場合がある。
276NAME IS NULL:2010/12/16(木) 19:18:29 ID:???
>>275
アホちゃう?
277NAME IS NULL:2011/03/01(火) 14:42:43.26 ID:???
パーでんねん
278NAME IS NULL:2011/08/09(火) 17:16:40.70 ID:???
第一正規化まで終わってる、つまり1枚の大きなテーブル(4Gくらい)があるんですが、自動でその後の正規化をやってくれるソフトってないですか?
知っている人がいたら教えて下さい。
279NAME IS NULL:2011/09/02(金) 19:31:02.37 ID:XFcjaMI+
検索用にタグ機能を作りたいんですけど
どんなテーブル構造にするのが一般的ですか?

| 記事ID | タグ |
で記事IDを重複キーにするか

| 記事ID | タグ1 | タグ2 | タグ3 | ・・・ |
で記事IDをユニークキーにするか

タグの上限は未定です
280NAME IS NULL:2011/09/08(木) 18:42:15.74 ID:???
>>279
要件次第だが

| 記事ID | タグ |

で記事IDとタグを主キーにするかな
281NAME IS NULL:2011/09/10(土) 19:46:26.54 ID:???
>>279
> | 記事ID | タグ1 | タグ2 | タグ3 | ・・・ |
> で記事IDをユニークキーにするか
おいおい第一正規形にすらなってないぞ
282NAME IS NULL:2012/08/09(木) 02:11:16.27 ID:57EvxVv2
保守age
283NAME IS NULL:2012/10/30(火) 13:13:15.70 ID:g6duZ5Cb
保守
284NAME IS NULL
テーブル設計(正規化)のアドバイスをお願いします。
メインテーブルがあり、フィールド数は全部で70程です。
主キーに対して従属はない状態(第二正規化)なのですが、
レコードが同じ内容で繰り返される各フィールドをテーブルに切り出す(第三正規化?)と35もマスタテーブルが出来てしまったのですが、
このテーブルとトランザクションテーブルをリレーションシップしてからクエリで全てのフィールドを再度結合する場合、
結合線もすごい数になってしまいますが、このような状態(数)は正規化出来ていないことになるのでしょうか?
各マスタテーブルは主キーとフィールドが一つのものばかりです。