トップページ⇒tech
988コメント337KB

データベース

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
データベース全般の話題です。
0232デフォルトの名無しさんNGNG
>>230
一番わかっていないのはチミだよ。
0233デフォルトの名無しさんNGNG
>>214じゃなかった。
>>220は悪い設計の見本。
0234PG一年生NGNG
>>231 >>233
よい設計の見本を教えてください。
0235デフォルトの名無しさんNGNG
>>233こそ本物のYahooBB顧客DB設計者
0236デフォルトの名無しさんNGNG
実力と経験とうんちくもあります(藁
0237デフォルトの名無しさんNGNG
>>234
やだ。
なお、なぜ悪いのかの理由は>>198の通り(俺の発言じゃないけど)

正規化をしらなければまずはこれを勉強しろ(第三正規形まで)。
データベースの入門書も読んだことないんだろう?
0238デフォルトの名無しさんNGNG
>>237
ケチはつけるが対案がない。
237は厨房の良い見本。
0239デフォルトの名無しさんNGNG
>>237
>>182の二の舞だぞ。
もうほっとけ
0240デフォルトの名無しさんNGNG
なお、良い設計を示して欲しければ、
Productの定義とDelivery処理の要件を提示しろ。
これがわからずに、あーだこーだ言ってもしかたない。
>>220の設計が悪いというのは言えるけどな。
0241デフォルトの名無しさんNGNG
>>237は最近正規化を学んで、その言葉を使ってみたかっただけです。
0242デフォルトの名無しさんNGNG
>>240はYahooBBの経営者がこのスレを見て怒り狂うのが怖いので
必死に自分の設計を正当化しようともがいているのです。
0243デフォルトの名無しさんNGNG
>>239
そうしとくよ。吉外がいるみたいだからな。

>なお、良い設計を示して欲しければ、
>Productの定義とDelivery処理の要件を提示しろ。

は本気だからな>一年生

俺に限らず、良い設計見本を知りたければ最低限必要だろ。
0244デフォルトの名無しさんNGNG
>>240
厨房丸出し。カコワルイ
0245デフォルトの名無しさんNGNG
厨房の逃げ口上:
○○を勉強しろ
××を読め
0246PG一年生NGNG
>>243
で、結局あなたは良い見本を知らないんでしょ?
0247Error401(243)NGNG
ああ、知らないね。
相手するのやめた。さよなら。
0248PG一年生NGNG
>>247
さよなら。
0249デフォルトの名無しさんNGNG
眠いって場よ。

ところで>>220の意図するところは分かったか?
>>243がいう存在しないはずのデータがあって、
それをキーにしているのは不自然というのはもっともだけど
とりあえず、あれが一番よく使われる設計パターンだ。
0250デフォルトの名無しさんNGNG
あーあ、変な展開になってるな。
もう寝よ。
0251PG一年生NGNG
>>249
>>220は理解しました。
でも、外部結合の結果は結局Nullの列ができるわけだから、
PRIMARY KEY制約を用いず、UNIQUE制約だけにするというのも
捨てがたい気がする。パフォーマンスが劣化するのは理解しているが、
業務的に実用に耐えるレスポンスなら
「Nullを含む主キーがあっても良いのでは?」という疑問は晴れません。
0252デフォルトの名無しさんNGNG
>>174の設計がいいんじゃネーノ?
0253デフォルトの名無しさんNGNG
俺は主キーにNULLがあってもOKに同意。
0254デフォルトの名無しさんNGNG
>>253
俺もそれに同意。厨房ばっかで困るよな、相棒。
0255デフォルトの名無しさんNGNG
まだやってたのか。

>>251
Nullを含まないものを主キーとするというのは定義。
よって、主キーにはNullを含んではいけない。

Q.E.D.
0256PG一年生NGNG
>>255
Nullじゃなくて"*"なんてヘンな記号ならいいの?
Nullなんて実装手段を「定義」だなんていわれても......
0257デフォルトの名無しさんNGNG
>>256
>Nullじゃなくて"*"なんてヘンな記号ならいいの?

良いか悪いかを俺に聞かれてもこまる。
それは要件次第であり、それを知っているのは君だけだ。

>Nullなんて実装手段を「定義」だなんていわれても

nullは「実装手段」などではない。「未定義(不定)状態」という概念。
0258デフォルトの名無しさんNGNG
>>255
256の言うとおり、番号未発番という状態を示すのにNULLを用いているに過ぎない。
表の論理的主キーなんてその値がNULLをとるか否かなど考慮しない。
0259デフォルトの名無しさんNGNG
>>255
それは定義(それもいうなら定理だろ)でもなんでもなく、
RDBMS製品の仕様に過ぎない。
0260デフォルトの名無しさんNGNG
>>258-259
そうではない。
だとすると、なぜRDBMSの論理値が3つの値を取ることを前提に
理論構築されていることを説明できるのだ?
0261PG一年生NGNG
>>260
番号未発番という状態を表すのにNullを用いてはならないと言っているだけですか?
0262デフォルトの名無しさんNGNG
>>261
その通り。

主キーの要件は「タプルを一意に決定できるもの」であり、
nullは「不定」を現す概念だのだから、主キーには使えないとしている。
これは定義なのだから、いくら「nullを主キーに使いたい」と言っても
駄目なのだ。

多くの(全てのかもしれない)RDBMSの実装では、「主キー」を
primary keyというconstraint(制約)で実装しているのだから、
primary keyにnullが使えないのは当然のこと。

Q.E.D.
0263デフォルトの名無しさんNGNG
なお、リレーショナルデータベースのモデルは、数学で厳密に定義
されているそうだが、俺はそれを知らないし、説明できない。

なお、俺が説明したことも誤りがある可能性はあるので、
その辺は承知しておいてくれ。
0264デフォルトの名無しさんNGNG
DB設計の入門書に書いてあることまだやってたのかよ。
ネロ
0265デフォルトの名無しさんNGNG
付け加えると、RDBの枠組みにnullという概念を入れてしまったことを
E.F.Coddも後悔しているというようなことをどこかで読んだ気がする。
(これは非常に曖昧な記憶なので間違っている可能性大)

Googleで検索してみたが、それらしいのがいくつかあったので、
興味があるなら、読んでみると良い。(E.F.Codd + null)
0266デフォルトの名無しさんNGNG
>>264
俺は起きたばかりなんだが(藁
0267デフォルトの名無しさんNGNG
質問者はもう寝たらしいので、勝手に話をすすめる。

未発送状態を"*"として、>>166のテーブルでProduct#+Delivery#を
PKとして良いのか?
あの表が他の表から完全に独立していて、なおかつ、将来拡張が
無く、Delivery#だけで、他と識別する必要がなければそれでよい。
つまり要件次第だな。

しかし、将来必ず更新される項目をPKに入れておくのは一般には
良くない。なぜならば、その項目をFKとして持つ表があった場合
Delivery#を更新する場合に、FKとして持つ表も更新しなければ
ならなくなる。
これは容易にシステム全体のデータの整合性を崩してしまう要因になる。
(ツールによるad hocな更新をしてしまったなど)。

ということで、「後から発送番号が付けられる」場合は、それを
単なる属性値として持っておくのが良い。
代わりに、システムが付番する「発送受付番号」のようなものを
作りPKとしておく。
つまり>>174のようにしておく。
>>202ということなので、今の実装で問題が無かったというオチだな。

なお、>>214は冗長だと思う。
特に「発送番号が付番済のもの」をひとまとまりに管理する必要が
なければ、テーブルを分ける必要がないと思う。

まぁ、データモデリングは人それぞれで、唯一の正解というものは
無いのが普通なので、どれが正解、どれが間違いとは一概には言えないもの。

ただし「無意味なSerial#」や「無意味な非正規化」は
間違いだとはいえると思う。
0268デフォルトの名無しさんNGNG
ん、ちょっと待てよ。
FK constraintを付けた場合、UPDATE出来なくなる実装のRDBMSが
あったような。これはRDBMSの実装依存の部分かもな。

更新されるPKなんてここ最近使ったこと無いので、>>267は微妙に嘘が
混じってる可能性があるので注意。
0269mageNGNG
mage
0270MBNGNG
>>262
>これは定義なのだから、いくら「nullを主キーに使いたい」と言っても駄目なのだ。
なんでその定義に従わなければならないんですか?
実装レベルでは、nullを許した方が性能がよくてもなおその定義に従うメリット
はなんですか?
0271デフォルトの名無しさんNGNG
>>270
というのであれば、主キーにnullを許す処理系を作って使えばいいじゃん。
いつまで、駄々こねてんだ。
0272デフォルトの名無しさんNGNG
>>270
PostgreSQLかMySQLを改造すれば?

俺は今まで主キーにnullを許すRDBMSを見たこと無いが、
それはそれなりの理由があると思う。それが何かは知らないけど。
そういや、主キーは更新不可というRDBもあったな。
0273MBNGNG
>>271
初カキコなんですけど..........
0274デフォルトの名無しさんNGNG
>>270
>実装レベルでは、nullを許した方が性能がよくてもなおその定義に従うメリット
>はなんですか?

メリットなんかないよ。だから、>>271-272の言うように、自分の好きな
使用でRDBを作ってください。
0275デフォルトの名無しさんNGNG
>>270
主キーにnullを許すと、「null = nullが真」とせざるを得ない。
なぜならば、FKとしてそのPKを指定したときのことを考えれば明らか。
一方、「nullはあらゆるものと一致しない」という定義がある。
これは矛盾している。

主キーにnullを許すのであれば、「null=nullが真」という前提で
理論構築、実装をしなければならない。

そんなことするのめんどくさいし、移植性も損なわれるので、
既存の仕組みに従ったほうが良い。
これがメリット。
0276デフォルトの名無しさんNGNG
>>275
なんか神学論争みたいだね。
0277デフォルトの名無しさんNGNG
>>276
そんなことないよ。
単純に、tbl1.col1(PK) tbl1.col1(FK)のときに、

select tbl1.col2, tbl2.col2 from tbl1, tbl2
where tbl1.col1 = tbl2.col1

がマッチしないよってだけ。だから、nullは「一意」という場面では
使えないよってこと。

使いたければ、ありとあらゆるものを変更する必要があるよってこと。
0278デフォルトの名無しさんNGNG
(誤)単純に、tbl1.col1(PK) tbl1.col1(FK)のときに、
(正)単純に、tbl1.col1(PK) tbl2.col1(FK)のときに、
0279デフォルトの名無しさんNGNG
>>277
ヤパーリ、神学論争だ。
イスラムを侵攻するなら偶像を破壊せよ!
0280デフォルトの名無しさんNGNG
>>279
だから、違うって。純粋に集合論モデルの問題。
上のほうで誰か言ってたけど、E.F.Codd博士もnullの取り扱いには
困ったらしい。何度か理論体系の方向転換をしたらしいぞ。
0281デフォルトの名無しさんNGNG
>>277の作るシステム目的は、いかに業務を効率化するか、ではなく
いかに論理に忠実か、なんだろうね。
0282デフォルトの名無しさんNGNG
Nullを許すと性能が上がる理論が、さっぱり理解できないんだが
おまえら説明してください。
0283デフォルトの名無しさんNGNG
説明するついでにRDBでよく使われるインデックスの仕組みについて
一度でも学んだことがあるかどうかも併記して置きなさい。
0284デフォルトの名無しさんNGNG
NULLの列はインデックスの対象から除外されることを逆に利用して、
検索が頻繁に行われる行以外のインデックス対象列をすべてNULLに
設定しておくとインデックスの件数を抑制でき、NULL以外の行の
検索速度を上げることができる。

パフォーマンスチューニングのテクとしては結構知られている手法だ。
0285デフォルトの名無しさんNGNG
で、バイナリツリーを使っているとして、どのくらい計算量が多くなるの?
中学校でてれば計算できるよね。

高校卒業してるんだったら、列の選択時にNullかどうかをチェックするコストも
全体の計算量に入れてみてね。
選択した列のがNullになっているかどうかをチェックするアプリケーションの
チェックにかかる計算料も数えておくとさらによいね。
0286デフォルトの名無しさんNGNG
ところで、今時Bツリーなんか使ってるRDBあんのか?
0287デフォルトの名無しさんNGNG
ちなみに、>>284のテクはORACLEのパフォーマンスチューニングセミナー
で教えてもらったテクだよ。
0288デフォルトの名無しさんNGNG
どこでそんな糞テク教わったのよ(藁
JETエンジンのマニュアルか?
0289デフォルトの名無しさんNGNG
>>287
Oracle7.0.x時代の話か?
0290デフォルトの名無しさんNGNG
>>289
8.0.4時代でっせ。
0291デフォルトの名無しさんNGNG
OracleもSQL Serverも基本はBTreeだぞ。
クラスタ化してるかしてないかの違いはあるがね。
0292デフォルトの名無しさんNGNG
>>290
nullは必要な時に使う。これ常識。
そんな小手先テクニックぎっしりのテーブルなんか使いたくないな(藁
0293デフォルトの名無しさんNGNG
7千万件ほどのテーブルに毎日1万件弱の行追加が発生するんだけど、
その新規追加行をバッチ処理で夜間に更新する。
7千万件の全行を対象にしたインデックスだと数分かかる処理が、
新規追加行以外のインデックス対象列をすべてNULLにしておくと
インデックスは1万件弱の新規行のみで作られるため、処理時間が
数十秒になった。
0294デフォルトの名無しさんNGNG
>>293
設計が悪い(藁
0295デフォルトの名無しさんNGNG
>>294
どんな設計だったの?
0296294NGNG
>>295
質問の意味がわかりません(藁
0297さらでぃんNGNG
結局、論理だけじゃ飯は食えないってことだな。
0298デフォルトの名無しさんNGNG
>>293
それって、そもそもNull可にすべきだったカラムをNot Nullにしてたって
だけの話なんでしょ。それは概念モデルレベルでの設計ミス。

夜間バッチで大量に更新処理が入る場合は、Indexを削除して、
処理をするのが普通じゃないか?

Indexがある状況で、夜間バッチで更新時間を数分かかるのを
数十秒にするためだけに、Null不可のカラムをNull可にするのは
変だと思うぞ。
0299デフォルトの名無しさんNGNG
つーか、実際速くなるんだからそれでいいじゃん。
0300デフォルトの名無しさんNGNG
>>298
>そもそもNull可にすべきだったカラムをNot Nullにしてた
プライマリキーはNot Nullにできないんだよ。知らないの?
>Indexを削除して、処理をするのが普通じゃないか?
7千万件のうちの1万件を検索更新する処理にインデックス削除したらもっと遅くなるよ。
0301デフォルトの名無しさんNGNG
徐々に糞スレ化してきた模様。
0302デフォルトの名無しさんNGNG
>>300の追伸
当該のカラムはプライマリーキーの中のいカラムなんだよ。
0303さらでぃんNGNG
>>299
効果はどうあれ、理論に抵触する設計は認められないって立場なんだよ。
0304デフォルトの名無しさんNGNG
>>302
話が良くわからんが、主キー以外のカラムで、Null可にすべき
カラムをNull不可にしていた。そこにIndexを作成していた。
で、それをNull可にしたら速くなった。
つーこと?
だったら、もともとNull不可にしてたのが間違い。

Indexの再作成は確かに遅そうだな。俺の間違い。撤回する。
0305292NGNG
>>303
俺のことか?
「null」は使い方を誤ると、将来に禍根を残すので、使うべきところに
しか使っちゃいけない。これ常識。
0306さらでぃんNGNG
>>304
本来主キーの中であるべき1カラムのムライマリキー制約を外し、
ユニーク制約のみにした。
それにより、夜間バッチで更新対象の1万件以外の当該カラムを
NULLにすることが可能になった。
0307292NGNG
今までnull不可だと思ってたプログラマは、
where col1 = col2
とやっていたはず。
ところがこれをnull可にすると、マッチするはずだったものがマッチしなくなる。

で、全体を見直し、プログラムの変更をし、テストしなおす必要がある。

別に「理論」でいっているわけじゃなくて、null値属性を変えると、
とんでもない作業が発生する可能性があるから、良く考えて
設計しておくって話。
0308292NGNG
>>306
ということは、それは「主キー」ではなかったのだ(ループ(藁
0309デフォルトの名無しさんNGNG
>>306
要するに、本来主キーでないものを主キーにするために、無理やり
Not Nullにしてたってこと?

だったら、それこそ設計ミス。
0310デフォルトの名無しさんNGNG
論理設計モデルと物理設計モデル、RDBMSの実装を利用した
テクニックをごっちゃにするから話がおかしくなる。

E.F.Coddを起源とするRDBのモデルにいちゃもんをつけたいなら、
新規にモデルを提唱して広めろ。誰も止めんぞ(藁
0311デフォルトの名無しさんNGNG
お前ら仕事一月くらい休んでいいから
きちんとRDBの仕組みを理解しろ(w
0312デフォルトの名無しさんNGNG
まとめてみる。
お前ら刹那的すぎ。

教科書レベルのRDBの設計の基礎を押さえているだけで
貴重な人材だと言うことでよろしいか?
0313デフォルトの名無しさんNGNG
ふむ、まるでHTMLにおけるw3c信者と実務主義者の争いのようだね。

違うか。
0314デフォルトの名無しさんNGNG
>>312
教科書レベルの事もきっちり押さえていない奴多すぎる。
0315デフォルトの名無しさんNGNG
べーター

デース
0316デフォルトの名無しさんNGNG
お前らはっきり言って、ISAMがお似合いです。
0317デフォルトの名無しさんNGNG
すげえ遅レス。
>>56

RBSとかTEMPとかREDOLOG置き場とかINDEX領域とかUSER領域とか、
同じディスク装置の上に入れてるだろ。

OracleのDBA向けの本を買って、テーブルスペースの
切り方を学んで、稟議書を書いてHDD買い足しなさい。
物理的に、それらのセグメントを分割しなさい。
0318デフォルトの名無しさんNGNG
とんでもなく低レベルなスレになっちゃったね。
「正規化」を勉強してから出直せ(プププ
0319デフォルトの名無しさんNGNG
>>314
というか、教科書レベルを*理解できない*奴が多いみたいだな(藁
0320デフォルトの名無しさんNGNG
教科書読まずにセミナーにいくと、
いいかんじに知識が偏るらしいな
0321312NGNG
おい誰か反論してくれよ
ワシの暇をつぶしてくれ
0322デフォルトの名無しさんNGNG
>>321
的確な洞察により、反論は無いと思われます(藁
0323デフォルトの名無しさんNGNG
日付を空白にしたいとき何いれるの?
0324デフォルトの名無しさんNGNG
日付型はYYYYMMDDっぽい形式でCHARっぽい型で持つといいよ。
空白も入る。

dateやdatetime型はDBの種類によって精度が違うし、
バージョンによってサイズや精度が変わる(かもしれん)ので
あまり推奨されていない。
0325デフォルトの名無しさんNGNG
>>323
DATE型なんて使わないな。
ついでにCHAR型も使わない。
NUNMER型も使わない。
全部VARCHAR2型だな。
使うときにキャストすればいい。
0326デフォルトの名無しさんNGNG
ぜんぜん突っ込み甲斐がないな、それ。
0327プミポンNGNG
>>325
ついでに全部Varchar2(2000)すれば?
ExcelやAccessのValiant型と同じ。
0328デフォルトの名無しさんNGNG
男らしく和暦で入れとけ
0329デフォルトの名無しさんNGNG
漢だ・・・
0330デフォルトの名無しさんNGNG
お前ら、ネタはマ板でやれよ。
0331デフォルトの名無しさんNGNG
日付(日時)は、出来る限りRDBが提供されている日付(日時)型を
使うのが吉。つーか、常識。
CHARにこだわるのは、化石COBOLER。あるいは、ネタ。
■ このスレッドは過去ログ倉庫に格納されています