頼むから正規化しろよ 第二正規形
自己レスだけど、ちょいと言いたい事が足りてなかったかも。 3だとリレーションを保てない、2,1ならOK,なら1にすれば良くて、2の存在価値は 相変わらず不明、とか思われると遺憾かなと思って。 こうなるとやっぱり程度の問題で2の方が更新異常とかの面でまだベターだから、 せめてそこまでは正規化しましょうよ、という事になるのかも。 だから、やっぱり無駄ではないと思うんだけどな。 度々レスありがとうございます。 >>138 > >>137 > うーん、正規形についてなんかちょいと誤解があるような気がするんだけど・・。 > もしかして、第一正規形からスタートして第三正規形でゴール! > だから、第二正規形っていう中継点を通過する意味がわかんないよね、 > 一気にゴールでいいよね、とか思ってるのかな? 正にそんな感じで思っていました。 > もちろん、設計上は第三正規形を目指して正規化しろとは言われるが、 > 各正規形にはそれぞれ特徴があって、例えば第二正規形でないと > リレーションをすべて保持できない、とかそういうケースもある(時系列の保持だか、期間の管理だか) > また実装時の動作速度を考えて(JOINより多重持ちの方が早いとか)で > あえて正規形を崩す場合もある。稀だと思うが。 ここらへんの話を詳しく知りたいと思っています。 ヒントをもらったので調べてみます。 > ちなみに、余計な話だけどすべての関数従属をとりはずすと > ボイスコッドの正規形になるんじゃないかな? > 第三正規形は候補キーの中の関数従属については容認してるはず。 > 間違いがあったら、どなたか指摘、訂正してくださいませ。よろしく。 そうなんですか、勉強不足でした。調べてみます。 ありがとうございました。 >>140 テクニカルエンジニア DB の参考書とか読んでみるといいよ。 こういうDBの理論とかの専門書って少ないし高いし・・・ テクニカル DB 保持者ですが設計の経験がほとんどありません、逝ってきます。 テクデの勉強ってDBだけじゃなくて、業務知識のストックにも なるところが実務向きでいいと思うんだよねー。 なんか、自分の周りではあんまり知られてない試験なんですが。 大規模システムとかやってると、色んな業務形態に触れる ことが少ないと思うので、こういう試験を通して、自分の未経験分野の 業務知識をつけてくのって、試験受かる受からないに無関係で 重要だと思います。 そんなに大きな案件ではなくて、クライアントが言うことばかりでかくて、 たとえば、データは何十万件になるとか、そのくせ、仕様はなんにも決まってなくて時間がない、 その上、実際は1年もしないうちに放置状態になるのが目に見えてるような案件だったら、 DB設計なんかくそ真面目に考えてるより、冗長になっても1テーブルで済ませちゃうってやり方が 我が社ではスタンダードなんですが、これってとんでもないことなんでしょうか? 普通。 受託案件は自分がメンテするわけじゃないからなんでもありですよ。 >>145 やりにげ、って感じですかね? >>146 作り始めてからあれこれ口出されるのにいちいち対応するなら冗長でも1テーブルのほうが楽では? 変なとこで却下されたりすると、正規化してるのが足かせになってよけい面倒なことになってる希ガス 確かに正規化しすぎると変更に弱くなるね。 ってか、DB構造見ていじわるしてるのか、という変更ばかり発生する不思議。 うちではその辺、設計者の腕(技術+業務知識)の見せ所なわけですが。 >>148 そっちの方への拡張性を考慮して組んだりするとそのマスターまったく要らなくなったりとかw なんで、足かせになるような仕様を要求しといて、それに対する対処がやっと済んだころに却下になるんだ? もしかして、もうすごいスキルを持った嫌な奴なのかもしれん スピードパフォーマンス重視 or 管理効率重視 この二極化しかないと思うんですが。 それぞれに応じて、正規化なんて、教科書どおりにやる必要、 取捨選択すればOKっすよ。 現場で仕事もしたことないOraMasの女とかが、 正規化を演説してたりするんだよなぁ・・・・頃したくなる・・・・。 非正規化するのも、必ずしもパフォーマンスだけが目的ではないしね。 初心者の頃はマスター系とトランザクション系の区別さえつかんかったなぁ・・・ 誰か第5正規形を直観的に教えてください... 事例を示して、ほら第5正規形じゃないと異状が起きるでしょ?というのは良くあるけど なんで異状が起きるのか構造的に理解できません。 出来れば結合従属性の概念も。 字面のままの定義は分かるけど、何がどう「従属」してるのかサッパリ。 >>155 どうもありがと。なんとなく解かりました。 でもこれ、多値従属性の定義の説明が若干間違ってるねえ。 ? んー、やっぱ良く解かってないかも。 「すべての情報がそろわないと登録できない」という制約は 別に結合従属性だろうがなかろうが、 ぜんぶの属性がキーであるなら、どんな関係でも当てはまるよね? 何か問題をすり変えられた気分です。 ほかの解説でも、同じなのですが。 結合従属性を持つ関係は、 どういう冗長性があって/どうして情報無損失で分解可能なのか ...ってのがやっぱり解らんです。 正規化のことじゃなぃんだけんども リレーションの設定って要るの? たしかにキーや関係の確認のためにあれば便利だけど、 自分で設計してるもんだから、リレーションを絡めた処理は VBAで素で組む。困ったことないんだよ。 みんなどう? たしかに最初は律儀にリレーション設定してたけど、漏れも クエリなんかでその都度繋げるし、参照整合性が邪魔になる時もあるし 同じマスターテーブル(一側ね)を複数繋げるときも邪魔。 設定しないほうが、他人が見たときDBの仕組みが分かれにくいから いじられるの阻止するのにもいいし。 データインポートするときとかうざいよね>リレーション まぁ、インポート時は無視するオプションとかもDBによってはあるけど 平成の大合併で住所変更。顧客マスタの住所と住所マスタの住所の整合性がとれてない。。 正規化してねーと、こんなことになる。。今日中に終わるかな。。 運用部員がマニュアルで作業するときには制約はあったほうがいい。 制約を回避するINSERT、UPDATEを書けるようになれ >155 アクセのレベルを疑うような記事だな。 BC正規化なんて、ひどい。つか、事例悪過ぎ。 ものすごい遅レスなんで下げる。 すみません質問させて下さい。 共通の商品マスタ(キーは商品コードのみ)をシステムで使用していて桁数や採番ルール等で新たに 商品コードを使いまわすというのは皆さん普通にやりますか?各サブシステムには過去のデータ が残っていて当然使いまわす前の商品コードも保持されています。ただしDBでリレーションシップが 組まれている訳ではありません。採番ルールを変えて新たな商品コードを取る事も可能です。 過去データを参照するのであればマスタデータを削除、使い回しをする行為は厳禁だと思ってます。(←ここら辺が大きな勘違い???) 自分的には採番ルールを変えるのが妥当だと思うんですが。皆さんはどう思われますか? 何分あまり経験が無いもので一般的にはどうしているのかわかりません。 皆さんの意見を聞かせて下さい。宜しくお願い致します。 内容が漠然としすぎている気がするが、藻前が設計するんなら 藻前の好きにすればいいと思うが・・・。 つか、DBでリレーションされていないのに商品マスタがどーこーって話を 聞く時点で相当にアレな設計な印象をうけるのだが・・・。 物理設計でリレーションシップなしは普通。 それ以前に「リレーション」とかいってる>168の方が ちょっとなんだかなあという気がするんだが。 コードを使いまわして全く別の商品に割り当てるなんて 信じられない世界だけど、お客さんがそうしたいってなら しょうがないんじゃないの?お客さん都合を実現するのが システムなんだから。 お客さん都合でどうなるかわからんコードをキーにするのが悪いよ。 やるとしたら、コードと有効期日FromとToかなんかを複合キーにするしか ないんじゃないですかね。 >>168 >>169 ご意見ありがとうございます。 しかし、システムを引き継いだ時点でそういった仕組みで稼動しており どうにもならない状態だったもので・・・作り直すと結構莫大な工数となりますし。。。 >コードを使いまわして全く別の商品に割り当てるなんて >信じられない世界だけど 自分が聞きたかったのはこの言葉かもしれません。 お客様もコードが重複する事の弊害も考えずに削除使いまわしを口のにされている模様ですので コードの桁数を増やし100年位は重複せずにすむ採番ルールを採用する方向で進めて いくべきだと思いました。 本当にありがとうございました。 >物理設計でリレーションシップなしは普通 物理だろうが論理だろうがリレーションシップがないんなら そりゃExcelやCSVやCOBOLerな印象があるな。 設計者の理想であるクソ長い商品コードを使うか?か 顧客の要望の通り、過去の番号と重複するけど短い商品コードを使うか? ってのはそれぞれの事情があるからなぁ。 まあ単に顧客が最初のクソ設計になれてしまったんだろうが。 お客さんが既に使ってるコードにはデータベース的な厳密さはないが、 手作業上の必要や業務上のノウハウが詰まってることが多いから簡単にはなくせない。 多くの場合サロゲートキーモデルが有効であることが多く、 主キーはシステム側でユニークで長いのを振り、旧来のコードは属性として使用する。 例えば在庫などに張るシールなどでは後者を大きめに表示した上で両方のコードを印刷している。 >>171 まあまあ、COBOLerとか言う前に現実を見よう。 制約っていらなくね?スレでも議論になったくらい 参照整合制約ありなしは結構二分されてるよ。 あり派は実装を見れば設計の意図が判るって意見があった。 なし派は制約つけるとデータメンテが面倒になるからって意見があった。 特に開発段階でテストデータガンガン入れたりする場合とかだね。 どっちも気持ちは判る。 まあつけない派は現場の現実解って感じではあるなあ。 バッドノウハウというか。 >>173 いわんとする事はわかるが、だから>>171 はCOBOLerと揶揄しているのだろう。 そして、必要最低限のテストもしない人種はCOBOLerに多いな。 職場にもよるが現代(?)のSQLやらJava寄りの人種は テスト用のツールを用意&作成したりして、テストのシナリオも 作って開発するけど、ExcelなVB厨やCOBOLerは あんましそういう概念ないよな。ひたすら手で打鍵とか言うし。 現場の現実解と言えばそうなんだが、COBOLerはあんまし学習能力とか 向上心とかない連中の思想だと思う。 うーむ、確かに現実解てのは耳障りがよくて 要するに向上心の欠如じゃないかといわれると ぎゃふんだなあ。 まあ制約に関しては話題がずれちゃった感があるので ぎゃふんってことでゆるして。 で、制約いらないスレはこっち。止まってるけど。 http://pc10.2ch.net/test/read.cgi/db/1087483786/l50 >171の、クソ設計にお客さんが慣れちゃって 見直しさせてくれないってのは、判るよー判る。 これも向上心の欠如っていやそうか。 主キーが倍精度変数って別におかしくないですか? 主キーは文字変数であるのが望ましいと思っているのですが・・・ 倍制度でも検索が遅くないならいいんじゃね? ただ、そんな計算結果みたいなフィールドを主キーにする設計の方がおかしいと思うけど。 >>176 numberならアリかも知れんが、doubleみたいな近似値はありえん。 64bit整数やdecimal(number)系で桁数の多い場合の主キーで、 それを扱えない言語から利用する場合やむなく実数変数を宛がう事があり この場合は困ることがある。 MSSQL の DATETIME を主キーのタプルに組みこんだらVBAがミリ秒の 分解能を扱えず逝きかけた当方が通りますよ。 SQLから誘導されてきました ずいぶん初歩的な質問で悪いんですが合併律、分解律、擬推移律の成り立ちを証明したいんですが… アームストロングの公理系で調べても成り立つとしか書いてないもので… だれか証明のプロセスを説明していただけないでしょうか? MySQLに natural join ってあったのな。 今頃知った俺ギザ間抜け 初心者です、質問です。(他スレで聞いたらここで質問するよういわれました) Mysqlでテーブル作ってて、フィールド数が90くらいになりそうです。それで問題ないのか知りたいです。 正規化する必要があるのかどうかを知りたいんです。 テーブルは、ライブの情報を扱うものです。なので登録情報は 開催日、開始時間、料金、イベント情報etcの基本情報と 出演者名、出演者のURL、演奏楽器etc の出演者情報になります。 出演者はイベントごとに1〜10人に分かれて不安定なので正規化・分離するなら この部分かなぁと思うんですが、、 それともこの程度なら同じテーブルに入れてもいいのか、判断しかねてます 正規化(テーブルの分離)する場合、登録フローとしては、基本情報の登録時に 自動インクリメントでイベントIDを生成し、それを主キーとして参加者テーブルへの 参加者を登録することになるかと考えています。 正規化する必要あるでしょうか? 初心者の為判断しかねています。 登録ごとにテーブルに空欄があったりなかったりというのが マズイような気がしてそれが気になります。 お暇な方、回答お願いします。 今はイベントテーブルに出演者やそれに付随するフィールドが それぞれ10個ずつあるような作りになってるの? まぁ、分けるとしたら。 イベント(id, 開始時間、料金etc)→出演(イベントid, 出演者id)→出演者(id, 出演社名、URL、吹奏楽器etc) って感じで新たにテーブル2つ作るような感じかな。 フィールドが90個っての自体はギリギリ許容範囲かなという気もするけど、 同じ出演者が当然何回も出てくると思うんで、 出演者情報はテーブル分けて、別に管理すべきだろうね。 それでかなりシンプルに成りそうだし 詳しい説明ありがとうございます。ホントに助かります。 アドバイスいただいた中で、出演者情報(名前とURLと楽器、プロフ文etc)にあたる部分は 実は別に用意してるんですが、イベント登録するにあたって、当日演奏する楽器が 必ずしも登録してるものと一致するとは限らない可能性もあるので、 イベントテーブルに(名前、楽器、URLを)ガッチャンコしてるんです。 さらに言うと、出演者テーブルへの登録件数(演奏家の人数)が少ないうちは、 プレイヤIDをイベントテーブルに登録するというプロセス自体が機能しないのではという 危惧もあり、無駄にフィールド数が増えてるんです。 1)一覧から参照する(出演者テーブルをリスト表示後、各プレイヤ参照ボタン押す)→IDを入力 2) 1)が出来ない場合(お目当ての出演者がリストに未登録の時)は名前・URLを直接入力してください みたいな感じで。 なので、1イベントあたり最大10人てのを全部登録したとしても、プレイヤ用フィールドのうち 半分(リスト参照して入力用or手動入力のいずれか)のフィールドは必然的に空欄になるんです これがムダでヘタクソなやり方なのか、それとも仕方ないと判断していいものなのか… 仕方ないよですむならこのままやっちゃおうと思うんですが どうなんでしょう? プロじゃないんで経験則が働きません… > 実は別に用意してるんですが、イベント登録するにあたって、当日演奏する楽器が > 必ずしも登録してるものと一致するとは限らない可能性もあるので、 > イベントテーブルに(名前、楽器、URLを)ガッチャンコしてるんです。 イベントごとに楽器が違うということであれば、 楽器は中間テーブルに持てばよいね。 >>184 でいくと 出演(イベントid, 出演者id, 楽器) という感じ。 > 2) 1)が出来ない場合(お目当ての出演者がリストに未登録の時)は名前・URLを直接入力してください > みたいな感じで。 必ずしも全ての出演者が登録される必要は無いってことだね。 それなら上の中間テーブルで 出演(イベントid, 出演者id, 楽器、名前、URL) みたいにしたらいいかもね。 出演者idは空白可で。 > これがムダでヘタクソなやり方なのか、それとも仕方ないと判断していいものなのか… > 仕方ないよですむならこのままやっちゃおうと思うんですが どうなんでしょう? 無駄でヘタクソなやり方だとは思うけど、 サイズ的に管理しきれないほどでもないから、 今のままでもいいんじゃないかという気はする >>187 なるほど、凄く勉強になりました イベント基本情報テーブルと、中間テーブルに分ける場合は、 インターフェース的には 基本情報の登録→そのイベントIDを拾って→出演者登録 って流れにすればいいんでしょうか? 出来れば10人以上にも対応したいんで、 ソッチのやり方で理解した方がいいですよねぇ >>186 >ユーザーインターフェースとテーブルは別だぞ。 おっしゃるとおり、その部分の理解が薄いんです。 いろいろ勉強してみます。ありがとうございました。 > インターフェース的には 基本情報の登録→そのイベントIDを拾って→出演者登録 それでいいと思う 許可マスタ 項目名 field名 型 桁数 コード code varchar2 2 エリアコード1 area_code_1 number 2 判定1 area_judge_1 varchar2 1 エリアコード2 area_code_2 number 2 判定2 area_judge_2 varchar2 1 エリアコード3 area_code_3 number 2 判定3 area_judge_3 varchar2 1 エリアコード4 area_code_4 number 2 判定4 area_judge_4 varchar2 1 エリアコード、判定は全84項目存在するが、途中を省略する . . . こんなDB定義もうやだー 会社コードと会社名だけのテーブルに正規化する価値ってあるかな? JOINのコストが恐ろしく無駄な気がするんだけど。 そうやってマスタでも管理してトリガで更新したいって提案したら不安な顔をされた。 こういうのはバットプラクティスだったのかな? >>194 会社なら(>>195 のいうように)ふりがなとか所在地とか取引状況とか、付帯情報が後から湧いてきそうだから、俺ならマスタにする。 joinのコストがCPUを指してるなら「誤差の範囲ですよ」、開発時のタイプ量を指してるなら「ビュー用意しとくんで」。 つい最近だと、印紙種類(収入印紙と登記印紙)をどうしようか迷った。 「そんなもん、増えた時にシステムの対応が必要だったら、データ増やすだけじゃむりだから(アプリに手を入れるから)」 という理由で、これはマスタ可しなかった。 >>194 今の時代、会社名などいくらでも変わる可能性がある。 当然、正規化するべき。 >>199 過去のデータで帳票を出す場合、 昔の名前で出なくなるな。 でも正規化自体は賛成。 取引当時の社名を出力しなければならないという要件があるなら そう作ればいいだけで、正規化の有無とは関係ない。 いや、それも本とかでは正規化(というか非正規化)の文脈で語られてるよ 社名の変更ならその程度で済むかもしれんが、合併とかどうするよ 合併したら新会社としてデータを起こすとか。 どうせ与信だなんだ大きく変更になるだろうし。 ただ旧組織との紐付けが必要か否かだなあ。 合算して昨年実績としたい、みたいな。 社名と日付を用意するなんてわざわざしなくても 社名変更だろうが合併だろうが別会社として扱えばいい >194 (1)取引当時の「社名」を「会社コード」と一緒に「取引テーブル」に書き写せばいい。 社名変更して「会社テーブル」の社名列を更新しても取引記録を打ち出すときは旧社名で出るし、 その会社との取引履歴を出すときにはコードで引けば社名変更に関わりなくすべての履歴を 引き出せる。 (2)もしくは、「会社テーブル」に「旧会社コード」を設けて、社名変更後はレコードを追加して 別の会社として扱うようにするとか。こうすると新会社分、旧会社分の履歴だけを取り出すときに 便利になるし、旧会社の名前も残せる。 (3)「会社系統テーブル{旧会社コード, 新会社コード}」を設けて、社名変更後は「社名レコード」に レコードを追加して、旧会社のコードと新会社のコードを「会社系統テーブル」に記録するように すれば、履歴を多対多の関連で残せるので会社合併・分社があっても追跡ができる。 (2)もしくは、「会社テーブル」に「旧会社コード」を設けて、社名変更後はレコードを追加して 別の会社として扱うようにするとか。こうすると新会社分、旧会社分の履歴だけを取り出すときに 便利になるし、旧会社の名前も残せる。 2回以上社名変更や合併を繰り返した場合でも大丈夫でしょうか? 207じゃないけど、2回以上でも問題ないだろ、単なるリンクリストなんだから リンクが1レベルしかできないリンクリストなんてないじゃん ただ、「この会社名の通用期間」みたいなものを設けて、特定の日付がどの通用期間に含まれるかチェックするとか、面倒だよ 吸収された後でまたスピンアウトみたいな離れ業はあるのだろうか 法的には関連性が切れてるだろうから、新しく起こせばいいのかな? >>207 (スレタイ)「頼むから正規化しろよ 第二正規形」 おそらく「取引テーブル」の候補キーは、「会社コード」以外の属性も含まれると 考えられ、 「取引テーブル」の「会社名」は、 「取引テーブル」の「会社コード」にのみ関数従属する為、 「取引テーブル」の候補キーの一部に関数従属することとなる。 よって、その「取引テーブル」は、第二正規形とならない。 ではどうするかというと、「会社テーブル」を履歴で作れば良い。 会社テーブル [ *会社コード、*適用開始日、会社名](*が主キー) >>209 新旧「会社コード」もありだろうけど、実装を考えると、 SQLでリンクリストを検索するより、 適用日付で検索した方が明らかにラク。 「取引テーブル」という名前から想像すると、「取引日」という属性を 持ってるだろから、「会社コード」「取引日」と「会社コード」「適用開始日」で JOINするだけ。 212の続き もともとJOINのコストが無駄という話しからだったが、 その程度のJOINコストが無駄というのは、どんなハード使ってるんだ、 という話しだと思う。 >212 取引テーブルに会社名列を持たせる設計の場合、取引テーブルの会社名はスナップショット として持たせるものであり、正規形を崩すものではない。正規形を崩す設計ならば、そもそも 会社テーブルを持たず会社の管理はすべて取引テーブルの中というようになる。 たとえば、商品販売明細テーブルに商品単価を転写するのと同じこと。商品単価を商品テーブル から引いてくる設計にすると、商品の単価が変わったときに過去の売り上げまで全部書き換わるのを 防ぐためのよく知られた手法を、取引テーブルにおける会社名の持たせ方に応用したものだ。 >>214 正規化について言及すると、それは正規形を崩してるだろ。 正規化手法は、”既約でない”関数従属を排除する為の射影である 必要があり、第二正規化された射影を結合することによって、 元の第一正規形の集合が得られる必要がある。 要するに、1事実1箇所になってないと正規形とは言えないってこと。 だから、スナップショットは正規化違反ということさ。 商品単価の話はJOINのコストが気にならないのであれば、 会社名と同様、履歴化して正規化すれば良かろう。 ただ、商品明細のように会社名に比べてデータ量が多く、 マシンの性能とJOINのコストバランスを考えると、 正規化崩して、明細にスナップショットを持たせた方が 良かったというだけだろ。 よろしく 依頼とは別でアンケートの集計もお手伝いすることになったんだが、 先輩がエクセル表で 店舗ID 店舗名 質問1 質問2のA 質問2のB 質問2のA 質問2のB・・・ -------------------------------------------------------------------- ってな表を作っていた。 (質問2のAは複数回答有りで、2のBは複数回答した数だけ答えるアンケート。) データを打ち込む人は、列が足りなかったら足していってた。 何万レコード分もあるから、普通に打つのさえ大変なのに…。 一緒に仕事したことないが、開発やってる時は多分できてることを 雑務になるとできないという不思議…。 いや、開発の時もできてるかどうか知らないが…。 > 一緒に仕事したことないが、開発やってる時は多分できてることを どういうこと? SPSSとかで集計するときのマルチアンサーのフォーマットって 先輩がやってるようなのが一般的だと思うが 先輩は勉強しはじめたばかりだから、 そんな仕事はしてない 統計で言うオカレンスとデータベースのタプルは似て非なるものだということだよ。 JOINのコストって高いね。 正確に言えば、検索キーワードとソートが必要な検索で JOINを行うと、インデックスがどれか一つにしか使えないから遅い。 検索キーワードがlikeだったりするとさらに最悪。 非正規化したほうが良い。 >>220 クラウド革命でITエンジニアは監獄行きです ttp://d.hatena.ne.jp/kazunori_279/20090610/1244599829 Google App Engine担当者に聞いた クラウド環境ではデータベースは「非正規化」して使う? ttp://www.atmarkit.co.jp/news/200906/09/gae.html 正規化について質問です 第一正規化は繰り返しフィールドの排除があるかと思いますが、 たとえば ID|購入者|商品1|金額1|商品2|金額2|商品3|金額3|商品4|金額4 01|AAA.....|TV1....|10万...|TV2....|11万....|TV3...|12万....|TV4....|13万... このような場合は ID|購入者 01|AAA ......と ID|商品|金額 01|TV1|10万 01|TV2|11万 01|TV3|12万 01|TV4|13万 と2つに分けるかと思いますが ID|購入者|販売担当者|購入日|配送日 の場合 購入者と販売担当者は人フィールドで、 購入日と配送日は日付フィールドなので これらも繰り返しフィールドとみなせるのでしょうか? >>223 そうみなしたければみなして良い。みなしたくなければみなさなくても良い。 正規化というのはそういったところを決定した後に行う操作だから。 通常は繰り返しとはみなさない。 あなたの言うとおりなら、 ID、人種類、人ID、日付種類、日付 みたいなカオステーブルができあがってしまう。 エンティティをしぼりこむのは業務分析ありきだから上記のカオステーブルが絶対ないとは言わないが、通常はないと言える。 >>226 ありがとうございます そうですよね 何かこれに関する情報がのっているサイトとかご存知でないですか? これを正規化と豪語する人がいて、そうじゃないという説得材料にしたいのですけど 簡単なデータで例を作ってみたら? 問題でれば、それで説明つく。 出なければ、そのデータでは、問題ないのかもしれないよ(その人は それを言っているのかもしれない)。 >>228 今日、この件お話したら、納得してくれたようです たまたま具体的なデータ例で、話をしてたら話の論点があって、ある程度解決作がみえてきました 具体的な例で話し合うのは重要かもしれませんね 同じ表にmember_idとmember_nameの二つの列があって、 member_id ・・・社内の人間なら社員コード。社外の人はNULL member_name ・・・社内の人間ならNULL。社外の人は名前 みたいになってるんだけど、これってもっといい方法があるよね? 社員コードは別の社員表にある。 社員表(社員コード,社員名) 社外表(コード,名前) メンバー表(メンバーID,・・・・・) 社員コード∈メンバーID 社員コード∈コード select B.社員名,C.名前 from メンバー表 A left join 社員表 B ON A.メンバーID=B.社員コード left join 社外表 C ON A.メンバーID = C.コード >>215 >正規化について言及すると、それは正規形を崩してるだろ。 >正規化手法は、”既約でない”関数従属を排除する為の射影である >必要があり・・・ > : >要するに、1事実1箇所になってないと正規形とは言えないってこと。 >だから、スナップショットは正規化違反ということさ。 超遅レスだが、>>214 の見解は的確で合理的じゃね? 販売業務で商品の販売単価が日時や取引数量、その他に応じて変動する場合、売上伝票や 注文書に載せる明細の単価に対し、商品マスタの単価との間に従属性を認めては駄目だよな。 ゆえに業務の性格によっては正規化の対象とはならないだろう。 そして、注文を行った時点でのスナップショットこそが、正に売買契約と売上認識の「事実」。 つまり、一つの売上伝票や一つの注文書をもって「一事実、一箇所」と認識しなければ、寧ろ 不都合なシステム設計をする事になるよな。 だから、>>214 は優良な実務経験者だと思うぞ。 ボイスコッドから高次の正規化は要注意だな。 それより対象業務をよく分析し、ER図等で得られた業務の大切な性格と特徴を損なわない正規化を 心掛け、顧客指向のITソリューションでメリットを提供することがプロフェッショナルの仕事だと思う。 ニコニコ動画のコメントやアマゾンのレビュー、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 欠点(?):動画の数だけテーブルを用意することになるけど、 自分はどうプログラミングするのか分からないです。 >>235 リレーショナルデータベースでのデータ設計は、プログラム言語のように構造体で カタチを決めて配列やリスト構造を持たせていくデータ設計と違って、集合論理と 関連の概念で解決しないとダメなんだよ。 ↓こんな風に持たせればそれらしくなるんじゃない? 【投稿動画テーブル】 動画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主様、乙でした >>237 ありがとうございます。 つまりそれは案2で、動画を見る度に 全てのコメントを収納した巨大な投稿コメントテーブルから 動画IDでコメントの抽出を行うんですよね? それって重くないんでしょうか。 案3だと抽出処理が要らないんで軽いのかと思ったんですが そんな大差はないのかな。。 read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる