1 :
NAME IS NULL :
2008/10/08(水) 18:34:13 ID:PQV+Wmyc
ふむ
早速質問なのですが、 日付を「昭和60年2月3日」のように和暦で扱うアプリの場合、カラム型は 普通に日付型を使った方がいいでしょうか? アプリは.NETで作っていて、 元号をコンボボックス、年月日をテキストボックスで選ばせるUIなので、 元号、年、月、日を別カラムで保持すれば楽かなーと思うのですが。 どうでしょう?
また落ちたのか。12までいってたから安心してたのに。 この板の即死判定って何レス? しかしまぁ、はっきりいって需要ないのかも。
大坊設計
DB設計ってどうやって勉強してる? よい書籍とかあったら教えて下さい。
文字列が全部固定長・・・ 3文字くらいしか入力しないのに、 100文字の固定長w 理由をたずねたら、 データベースの構造上、固定長のほうが処理が パフォーマンスがいいんだよって SQLみてみたら 全部のSQLに毎回TRIMかけてるしw TRIMするなら、最初から可変長にしてくれw
>>7 ERDレッスンかなあ。
業務ごとの濃い話になると別。
Webのシステムでキャッシュっぽいテーブルは固定長レコードになるようにしてる
>データベースの構造上、固定長のほうが処理が >パフォーマンスがいいんだよって COBOLerの脳内妄想かと。 固定長しか知らん人種だし。
完全な固定長のレコードにアドバンテージを設けているRDBMSはMySQLのMyISAMくらいしか知らない。
削除・更新が頻繁なテーブルでは、可変長だと行連鎖・行移行が発生 しやすいというのはあるな。 まぁ、ほぼ3文字しか必要ないのに100文字ってのはページ使用効率が 悪くて逆にパフォーマンスを落としそうだが。
14 :
NAME IS NULL :2008/10/21(火) 22:22:08 ID:JfHp8/7P
テーブル設計(論理設計)などの初心者が読むべき本とかありますか? 教えていただけたら幸いです
DB設計は、そのノウハウが書かれている書籍とか結構あるし、 テーブルの正規化はこうだといわれてたりするけれど、 人の作ったDB見てると、それらが必ずしも守られていなかったりしていて、 そのDBを作った人の個性があるように感じる。 誰かが作ったDBを、他の人が見ると、「これはこういう効率の悪さがある」と 設計を批判する事もあるようだが、システムとしては稼動しているし、 使用者にとっては特別致命的なものがあるわけでもなかったりする。 となると、DB設計というのは、これが正しい、これが結論だというものは 無くて、結局はその人の考え方(速度、保守性、拡張性、引継ぎ、などで 何処を重要視するか)の世界みたいなところなのかなと思う。 このスレに来てる人はどう思う?
17 :
NAME IS NULL :2008/10/25(土) 00:53:05 ID:Hv10EAg0
基本的かも知れないけど、質問させてください。 固定長の文字列を格納するのにchar、とvarchar2ではやっぱりcharのほうが速度的に良いの? 今まで行ったたいていの現場では「文字列は固定長・可変長関わらずvarchar2で」っていう感じでした。 理由はいろいろあったんだけど、 ・「こっちは固定長だからcharで、あっちは可変長varchar2で」っつーのが単純にわずらわしい →設計効率重視意見 ・「固定長をvarchar2に入れてもcharに入れるのと速度的に大して変わらない。大勢に影響なし」 →性能変わらない意見 ・charだと「固定長だと思っていたけど、その後に可変長になった」っていう仕様変更に弱い。 →当初より短い文字列を入れることになった→アプリ側でtrimを入れることに→うざい →心配だから全部trimを入れた→アプリ開発当初からうざい という感じで、固定長ならcharを使おうって積極的に押す人はいませんでした。 これまで固定長文字列をvarchar2で扱ってもcharで扱っても速度的に違いを感じたことは無いんだけど、 固定長ならやっぱりcharのほうが良いの? 最大で1万レコードくらいしか扱ったことが無いんだけど、でかいと違うのかね?
>>17 DBMSによる。varchar2といってるからOracleなのだろうけど。
>>17 制約とかINDEXとかにも関わってくるけど、DB2とかだとCHARの方が速いな。
1万レコードってそりゃExcelでも処理できなくもない処理量だから、
性能変わらないって意見も解る。
そういう現場なら設計効率重視で可変長のみでもいいと思うけど。
個人的にはそういう重要な作業を「わずらわしい」と感じるヤツに設計は
して欲しくないんだが。
20 :
NAME IS NULL :2008/10/27(月) 01:45:28 ID:eNeS7+/+
このスレの人はT字型ERをどう思います? あれってほんとうに効果あるの?
コボルの頃のじり貧ハードなら固定長で速度稼いでってテクも必要だろうけど。 今はハードの圧倒的進化とRACで、ほぼ限界無く欲しい処理能力得られるから可変長でも良いと思うけどね。 どうせミドルのCやJavaの時点でポインタという名の可変長メモリ管理してるから、速度気にしてもしょうがない。 可変長で処理できるほどの潤沢なメモリが無かった時代に使ってたようなコボルのようにどこまでも固定長で処理してる訳じゃないし。 業務だといろいろ小手先の要求が有るから、表記用の文字列と処理用の日付の両方で持ってる。 32日って入力して月末処理したいだとか。orz 伝票や帳簿には末日って書いてたからシステムでも同じようにやりたいとか。orz 締めのタイミングが、後藤日+末日だったりするし。日付型で末日とか持てりゃ苦労は無いが。
32日を使いたいから日付に文字列型を使うってのはそもそもの設計がイカれている印象しかないが・・・。 COBOLerがいるならある意味仕方ない感はあるんだが、 そこでCOBOLerのイカれた提案を拒否して、美しい設計を目指すべきだと思うけど。 つか月末(営業)日や五十(営業)日を算出する関数やクラスを定義するだけだろうに。
23 :
NAME IS NULL :2008/11/02(日) 21:49:46 ID:JdZg49uN
アッー!
何でも計算させないで、閉め日テーブル作っちゃえばいいじゃん。 1年に何十回もあるわけじゃないしユーザー側で決めさせれば良い。 規則的ではない変な締めがあっても対応出来る。
25 :
NAME IS NULL :2008/11/07(金) 03:23:17 ID:eToAOLwU
期間で値が決まるテーブルってどやって設計すればいいのかな? 具体的には 10日から、20日まで300円、21日から30日まで150円 ってテーブルと 毎日の売上数の入ったテーブルをつくって 14日から24日までの、売上高を算出させたい! とか思ってるんだけど ☆売価テーブル 期間開始日 期間終了日 売価 ___________10______________20____300 ___________21______________30____300 ☆売上数テーブル 日付 売上数 ____1__________5 ____2__________3 ____3__________2 ____4_________10 ____5__________8 . . . ___30_________7 こんなかんじ? でも、これだとSQLでデータ拾ってくるのに 日付JionでSumってもってこれないから、めんどくさいよね? かといって ☆売価テーブル 日付 売価 ____1_______300 ____2_______300 ____3_______300 ____4_______300 ____5_______300 . . . ___29______150 ___30______150 とかいう、売価テーブルつくるのも、いくら領域いるんじゃーって感じじゃない? なんか、いいほうほうないかな?
パフォーマンスは別途検討するとして SELECT SUM(売上数 * 売価) FROM 売上数テーブル JOIN 売価テーブル ON 日付 BETWEEN 開始日 AND 終了日 WHERE 日付 BETWEEN 14 AND 24 価格がどの時点で確定するかというのが重要なので 売上テーブルに売価が必要なこともあるでしょう。 売ったあとに売価テーブルの内容が変わったら大変なことになってしまうし。
>>25 人によって好みは分かれるだろうけども、自分なら日毎に持つな。
それと、開始日/終了日の方は終了日を省略して開始日のみにした方がまし。
28 :
NAME IS NULL :2008/11/09(日) 23:12:05 ID:IPd6NExy
ERの記法ってどれが標準なのかね? やっぱIE?
>>25 日付ごとに売値を持ってるほうが、メンテ楽そう。
売価テーブル、売価履歴テーブル、売上数テーブルを作って、
価格改定があったら売価テーブルを更新。一日の〆でその日の
売価テーブルを売価履歴テーブルにバッチでコピー。
で、
select
sum(売上数テーブル.売上数 * 売価履歴テーブル.売価)
from
売上数テーブル
left join 売価履歴テーブル on
売上数テーブル.日付 = 売価履歴テーブル.日付
where
売上数テーブル.日付 between '2008-11-14' and '2008-11-24'
みたいな。
>>25 >いくら領域いるんじゃーって感じじゃない?
1年でたった365レコードでしょ?
SQLやたら長くなりがちだけど、期間指定でもできないことはない。
32 :
NAME IS NULL :2008/11/10(月) 20:20:30 ID:1PkOr8o/
>>30 一品目なら365レコードだけど
これが、数万品目あつかう小売チェーン店とかだったら年、数百万〜数千万レコード
これを何に使うのかによるけど、売り上げを算出するってことは前年比とか
数年分の比較に使うんだろうから、その3,4年分
って考えたら、結構な量になるんじゃね?
でも、実際売価が変更されるのは、週一回あればいいとこだろうし
ものによっては数年変えないとかあるだろうに、余計なデータ増やすのは
パフォーマンスからみるとイマイチな設計なきがするなぁ
>日付 BETWEEN 開始日 AND 終了日
で取れるようにしたほうが、DBサイズ小さくなってキャッシュ利き易くなるし、いいんじゃね?
データベース設計にも、デザパタみたいなものあるのかね?
こういう業務はこんな感じとかいう本はあるけど デザパタというよりアナパタに近いよな。
>>34 是非、その本を教えてください
お願いします
アマゾンで「渡辺幸三」で検索すると何冊か出てくる。
生産管理のはかなりレベル高い。生産管理やった事ないけど
読み応えあって面白かった。
あとは「グラス片手に」シリーズとか。
DBマガジン連載時によく読んでて会社のバックナンバー揃えて貰ったら
とたんに書籍が出おった・・・。
もうちょっと業務から設計よりになると「楽々ERDレッスン」も面白いです。
渡辺氏とは犬猿の仲。でも実装はこっちのが現実的かと俺は思う。
あとは本じゃないけど渡辺氏の公開してる
データモデルはいやーお世話になりました。
http://homepage2.nifty.com/dbc/
今ひどい自演を見た
このまえ『データベース・リファクタリング』て本買って読んでたけど 結局ケースバイケースで全然逆のこと書いてあったりして、途中で 読むの放棄した。結局ケースバイケースのバランスなんだよ!
>>37 ばれちゃーしょうがーねーな
でも本はいい本だから読んでね
まぁ、渡辺さんの本が良いってより他にあんまりないんだよな。 羽生さんは大規模システムもちゃんとやってきてる人なのかな? ABDとか大きいレガシーシステムでどうせいっちゅーんじゃ、みたいな。 業務系は技術系と比べて情報少ないんで、 自分のやってることになかなか自信がもてない。 各社ごとではちゃんとノウハウたまってんのかね?
>>40 貯まってたら3Kとか最下層とか言われて無いだろw
>>40 そうですね・・・他にないってだけかw
だけっていっちゃ悪いか。
業務系、バッドノウハウは立派にたまってましたねぇ。
とくに大手製造業の子会社行った時は恐れ入った。
全てのテーブルは主キーをもつべきですか?
リレーションテーブルは要らないかも 複合インデックスさえあれば
あったほうが楽じゃね。
例えばペットショップのDBを作るとして 犬テーブルと猫テーブルとかってわける? 動物テーブルでまとめる?
47 :
46 :2008/11/19(水) 02:53:38 ID:PDW1LNDk
別の言い方をすれば、 複数のテーブルで一意なIDが欲しくなった時どうする?
>>46 動物テーブルで分ける
ID+種別(イヌ/ネコ/ハムスター・・)
その場合、犬専用フィールドとか猫専用フィールドがあるならどうする? 動物テーブルには犬猫以外にも数十種の動物が含まれる それぞれが専用フィールドを持っていたら?
ヌルだらけの巨大なテーブルが1つなのと データがみっちり詰まった普通サイズのテーブルが複数なのと どっちが良いか 後者にした場合、動物全体での一意IDが欲しい場合どうするか?が問題になる
テーブルを犬猫で分けて、一意ID用1対多リレーションテーブルを作る場合 フィールド:一意ID、犬ID、猫ID、、、、 これだと動物の種類の数だけフィールドが必要で、 新しく動物の種類が追加された時にテーブルの追加だけでなく ここへのフィールド追加もやらなきゃいけない。 テーブル追加だけで済んだ方が良い。
色々書いたが 1つの巨大テーブルにするほうが 実用上の障害が思いつかない 誰か思いつく?
>>49 ID+種別(イヌ/ネコ/ハムスター・・)+属性
1つの巨大テーブルがいい人はExcelでもいいんじゃ?
55 :
46 :2008/11/19(水) 16:21:28 ID:???
>>53 それは属性テーブルを動物別に作って外部キーはるってこと?
結局
>>51 だと思うけど
今のところの結論としては、
動物テーブルでまとめて、動物別にビューを作るのがいいかなと
一意ID用リレーションテーブル作っても同等の機能は達成できるんだけど パフォーマンス的に不利だからね かといってテーブル間の一意IDが欲しいがために1つのテーブルにまとめるってのも おかしいとは思うけどね
57 :
46 :2008/11/19(水) 17:43:56 ID:???
一応、複数のテーブル間で一意IDを得る方法はあるらしいんだが 単に一意IDを振っても、あるIDがどのテーブルのどのレコードなのか を特定できなきゃいけないからリレーションテーブルは必要なんだよね そしてパフォーマンスの不利は避けられない やはり動物テーブル+ビューが最適と判断した
>>55 例えば明日からペットショップでマンモスハナアルキの扱いを
新たにはじめるとして、そんなマイナー動物一種類のために
巨大な動物テーブルのスキーマを変更するのもどうかと。
ID+共通データの動物リレーションと動物別リレーションに分けて
ある場合、ハナアルキ類のためのリレーション一つ作成して後は
幾つかビュー定義をちょこまか修正すれば完了。
既にストアされているデータへの影響は少なくて済むはずです。
>>57 下らなすぎてスルーしてたけど
> やはり動物テーブル+ビューが最適と判断した
最適かどうかは場合によるわな。
NULLだらけの横長テーブルなんて保守したくないし。
パフォーマンスの不利がどれほどのもんかとかな。
60 :
46 :2008/11/19(水) 18:13:15 ID:???
>>58 そういえばテーブルへのフィールド追加って登録されてるレコード数に依存して負荷上がるのか。
でも動物テーブルから動物別テーブルへのリレーションはどうやって張るの?
WEBアプリフレームワークが自動認識してくれるような形で張るには、(つまりRDBの基本仕様上で張るには)
>>51 みたいに動物の種類数だけフィールドを用意しないといけないと思うんだけど。
61 :
46 :2008/11/19(水) 18:14:08 ID:???
>>59 明確な答えを持っているなら教えてください。
邪魔がしたいだけならお帰りください。
62 :
46 :2008/11/19(水) 18:17:11 ID:???
動物別テーブル側に動物テーブル上のIDを持たせて 動物別テーブルと動物テーブルを結合したビューを作っておけば良いのかな その結合処理って高速に出来るのかな?
ここはお前の専用スレじゃないんで、私物化するなら出てってくれない?
64 :
46 :2008/11/19(水) 18:18:38 ID:???
>>63 スレに沿った話題であり問題はないと思います。
>>60 >でも動物テーブルから動物別テーブルへのリレーションはどうやって張るの?
基本的には
>>62 の通りで良いのではないかと。
アプリケーションフレームワーク云々は別として、Relational Database Model
に基づいて実装するなら、動物リレーションで各動物に一意な動物IDをキーと
して振って、種類別リレーションからはその動物IDを参照。
後は動物リレーションと各種類別リレーションの間に外部キー制約を定義。
種類別にIDを振っても良いけど、基本的には冗長になるので必要無いはずです。
あとこういう分割は普通に行われているので、実用的な速度で結合処理を実現
する方法についてはちゃんと解が存在しています。
インデックス等々に関して調べると良いのではないかと。
66 :
46 :2008/11/19(水) 18:32:26 ID:???
それで良さそう。 ありがとう。
>>44 あれ、もしかしてリレーションテーブルには各外部キーにインデックス張っても
意味ないの?
>>62 DB構築者がビュー作って使う利点ってあるの?
>>44 は、リレーションテーブルに行われる検索はほとんどの場合
他の2つのテーブルを繋ぐ処理だけだろうって事。
DB構築者がビュー使う利点無かったら誰にあるんだよ ビューの利点=プログラムでSQL書かなくて済む、なんて理解してるんだったら そんなの定数定義しておけば良いだけだしDBにビューなんて機能持たせる意味ないだろ
設計レベルでビューは使わないだろうな ビューは実装寄りの話だ
>>68 リレーションテーブルって複合インデックスのほうがいいんでしょうか
どんなインデックスもそうだけど、クエリによると思う。
ユーザーは複数の権限を持っている事がある ユーザーは複数の組織に所属している事がある ユーザーが特定の部門に属しているか、特定の権限を持っている場合ににのみ 特定のテーブルと1:1の関連を持たせる しかし、権限や部門がが重複すると、そのたびにユーザーが抽出されるので 同じユーザーのデータなのに、複数データが出来てしまう。 こういうとき、どうするのが一般的なんでしょう?
とりあえず「組織」と「部門」の関連がよく分からないのですが・・・ DISTINCT一発で解決する問題のようにも見えます。
DISTINCT以前にもしかしてリレーションを理解してないんじゃないか 1つのユーザーテーブルに組織も権限も部門も全部つっこもうとしてるんだろ?
>>75 元のユーザーTBLがそういう感じなんよ
そこの部分はいじれない状況ということで許してくれ
やっぱり重複排除しかないのかねぇ
>>76 >元のユーザーTBLがそういう感じなんよ
もうテーブルが存在するなら、質問するときはそのスキーマの概略
程度でも示さないと。でないと答える方も
>>74 とか
>>75 みたいに無駄な
推理に頭を使う事になるでしょう?
リレーション理解してるならそんなの問題が既存のテーブル設計にあるの明らかだし こういう糞テーブルの保守が必要なんですけど、って話すだろw
>>76 普通に再設計して既存アプリのインターフェース(元TBL型のVIEW)用意すればいんでね?
スレ違いかもしれんが、 郵便番号マスタ、市区町村マスタ、銀行マスタ、法定休日マスタ、和暦マスタ、消費税率マスタ みたいなマスタテーブルを作ることに疑問を覚えるのは俺だけか? 何故、日本全国共通の情報を各々のDBに持ってちまちまメンテするんだろう? 疑問に思っちゃいけないことなのか?
・パフォーマンス ・完全参照系データでしかもそれほど動的に変わるものではないからWebAPIにする価値無し
セキュリティ
セキュリティが一番大きいね WebAPIにしたらどこの誰が利用してるか分かる可能性がある
切り替えのタイミング
>>81 その中でもファイルとして公開されてる物はある。
でも、提供先が国外だったりしてデータおかしかったりする物もある。
郵便番号なんかはバッチ処理でWebから落としてきて〜ってどこでもやってるでしょ。
↑をメンテ処理って言ったらそれまでだけどw
NTPサービスみたいに、定期的に全自動的でデータが補正されるようにならんものかね。 この手のマスタを毎月(或いは毎年)メンテしてるやつらって、 ホントくだらない人生送ってるな思うよ。
つまり、
>>88 はそんな仕事をやらされている自分の人生にうんざりしているというわけだな。
いや、そんな仕事もまともにできない部下にうんざりしてる。
全自動でやるシステムを提案すればいいじゃねーか
>>85 の切り替えのタイミングと、切り替える際の責任の所在かなぁ。
俺様に無断で祝日増やしやがって馬鹿政府のこんちくしょう。
将来なんちゃらクラウドの上にテータベースに乗っけて運用するよう
になると、この手のマスターデータは標準部品として提供されるように
なるのでしょうか。
>>90 部下ねぇw
部下のことをくだらない人生送っていると思いながら、その仕事をやらせているわけか。
それが本当なら、そりゃまともにやろうという気がうせるだろう。
94 :
NAME IS NULL :2008/11/24(月) 18:46:07 ID:4T2xxdv4
そういや地方自治体のシステムなんか 国会で法律が変わるたびに各々の自治体で ベンダーに依頼して改修してるんだよな。 後期高齢者医療制度対応とかさ。 この国はどんだけアホなんだろう?
>>94 SI企業にとっちゃ、仕事が増えるからいいんじゃない。
ピラミッド立てるのと一緒でみんな無駄だとわかってても 世の中がまわる為に必要だから止められないんだよ
自治体のは無駄だと思うが 住所データとかは各ベンダーが持たないなら国がWebAPI提供するしかないし 今の形が妥当
>>94 > 後期高齢者医療制度対応とかさ。
上手に作られたシステムなら、マスターの変更だけでOk。
でも、テストは必要。
結局、ベンダーに発注するしかない。
99 :
NAME IS NULL :2008/11/25(火) 11:32:56 ID:rHJnodNO
全体最適化とかまったく考えず各々価格だけで競争入札するから結果的に無駄に税金がかかる。 道路や建物つくる感覚で発注してるんだろうね。
DB設計を語るスレが制度設計を語るスレになっている件。
このスレで聞いていいのかな 商品テーブルにジュース ポテト ハンバーガーって商品があって この3つを組み合わせでバリューセットって商品を作りたいとすると 商品テーブルのバリューセットの主キーとジュースの主キーを組み合わせるテーブル作ればOKだよね?
バリューセットっていう1商品で別に他とつなげる必要があると思えんが
そもそも4行目の意味が分からん お前は同じテーブル内のレコードを繋げるリレーションテーブルを作ろうとしてるのか 別にそれでも実装上の問題はないのか・・・
>>102 この商品はこの3つの商品の組み合わせですみたいな感じで
セットの値段とバラの値段を表示したいなと思いまして。
>>103 実装上は大丈夫なんですが、もっといい方法があるかなと思って質問させて貰いました
全てのバリューセットが主菜(ハンバーガ)・副菜(ポテト)・ドリンク(ジュース)の 三点セットなら、バリューセットのキーと主菜・副菜・ドリンクのキーの計4つの キーを含むリレーションを作成。 セットによって副菜が2つになったりドリンク無しだったりと構成要素が大きく 異なる場合はバリューセットのキーと構成要素のキーを含むバイナリ リレーションで表現。
商品テーブル(IDと名前とその他共通属性) 単品テーブル(商品テーブルID+その他属性) セットテーブル(商品テーブルID+その他属性) 単品セット間リレーションテーブル(単品テーブルID+セットテーブルID) これでセットメニューがどんな構成だろうと対応出来るぞ バイナリも使う必要ない
108 :
NAME IS NULL :2008/11/25(火) 19:30:26 ID:Y/2zDRqR
ありゃ、誤解があったようで、 >単品セット間リレーションテーブル(単品テーブルID+セットテーブルID) これがまさに、バイナリリレーション(binary relation: 二項関係)ですね。 あとこの手のスキーマ設計の場合、 ・単品商品とセット商品の共通部分を商品テーブルとして切り出す ・単品テーブルとセットテーブルはそれぞれ共通属性も含めて保持 全商品の共通属性に関しては別途商品ビューを用意して参照 のどちらもアリなので、お好きな方をどうぞ。
まさにこんな問題が、テクデの過去問にあったな。
バリューセットは難しいね。 原価とか利益をどう持つかで色々な設計のパターンが出てきそうだ
リレーションテーブル・・・・難しい言葉ですね・・・
正しい言葉だと思うけど、何か意見があるなら聞かせて欲しい。 具体的な指摘をして欲しい。 俺がリレーションテーブルと言う言葉を使うのは、 マスタもテーブルもテーブルなのにおかしいと思うから。 かといってリレーションと言うだけではFKなども含まれてしまう。
>>112 >>111 はなんだか意地悪な感じだね。
「リレーション」というのは「テーブル」の事を指します。
なので「リレーションテーブル」っていうと「犬ドッグ」的な感じになっちゃいます。
RDBの基となる関係代数からの用語ですが。
テーブル:リレーション
レコード:タプル
フィールド:カラム
テーブルとテーブルの関連のことは「リレーションシップ」と呼びます。
>>112 >マスタもテーブルもテーブルなのにおかしいと思うから。
>かといってリレーションと言うだけではFKなども含まれてしまう。
ってか、この2行の意味が分かんない。
ついでに
http://homepage1.nifty.com/silabel/it/master_table.html さらに、リレーションシップという言葉がFKを含む例は
mysql workbenchがある。
リレーションシップという言葉はFKもリレーションテーブルも含んで使われている。
リレーションシップを示す”テーブル”のみを表現する言葉を俺は知らない。
ここで言うテーブルとはRDBMSに対するSQLでcreate tableで作成されるもののみを指す。
関係代数における概念は、実際のRDBMSやその関連ソフトにおいて
「不都合なく実装出来る形」にしか実装されていない。
概念的に忠実に再現されているとは限らない。
マスタ=基幹データ
(マスタと比較される文脈で出される)テーブル(俺がリレーションテーブルと呼ぶもの)=マスタ間のリレーションシップを示したテーブル
テーブル=マスタとリレーションテーブルを含んだもの(SQLでcreate tableで生成するもの)
果たして、この世に存在し得るデータ一般を表現する一形式を議論する場合と
ある業務のDB設計を議論する場合で
同じ用語体系が使われるべきだろうか?
>>115 >マスタなのかテーブルなのかを明示したい場合、どういい分ければいいの?
ディメンジョンとファクトかな、と思ったりするのはOLAP畑の自分。
(いや、厳密に対応するわけではないのでツッコミは勘弁ですw)
>リレーションシップを示す”テーブル”のみを表現する言葉を俺は知らない。
このようなエンティティ間の関係だけを格納するテーブルを定義する
というのはデータベーススキーマ設計におけるベストプラクティスと
いうかデザインパターンの一つで、でもそれには決まり切った名前が
ない、という不幸なんでしょうね。
昨日もバイナリリレーションと書いてやばっ、と思ったらやはり誤解が。
言葉って難しいです。
他人と話す時は、自分勝手な用語はつつしんだ方がよいと思う。
意味は通じるけど111のようなツッコミが入るのは不思議じゃない。
>>112 で「正しい言葉だと思うけど」と言ってたけど、正しい言葉ではないだろ。
通じるけど。
>マスタなのかテーブルなのか
これはもう通じない。なにを言ってるの?
>リレーションとリレーションシップで言い分けるより通じる。
まともに勉強している人はリレーションとリレーションシップで通じる。
そもそもrelationとは米中関係のことらしいという件。
>>119 >自分勝手な用語は
一般的な用語しか使っていない。
リレーションテーブルと言う言葉はテーブルと言う言葉を含んでいてマスタと比較する文脈であれば問題は無いと思う。
>これはもう通じない。なにを言ってるの?
一般的な用語であるかどうか検索して確認してから発言しろ。
>>121 酷すぎるという根拠は貴方の主観以外にあるの?
俺は検索と言う方法でそれが一般的な用語であると言う客観的な根拠を示したつもりなんだけど。
ディテールテーブルと言う言葉を上で使うべきかと書いたけど、
それは間違いだったね。
>>122 の通りディテールテーブルと俺が言うマスタ文脈上のテーブルは意味が違う。
関連テーブルだと英訳すればリレーションテーブルになるけど、
もし英語で設計書かけと言われたらどう書くの?
突っ込みどころが多すぎてめんどくさい
>関連テーブルは英訳すればリレーションテーブル バリューセットの例でいえばmany-to-manyの関連なので 「association table」かなぁ。
>
http://q.hatena.ne.jp/1177173258 > これのtbl_は恐らく関連テーブルを指してるだろうね。
質問には「普通のテーブル」って書いてあるよw
普通のテーブルって何よ!!!
ってくらいの低レベルな質問者なので、こんなの引用されてもなあ
> 本当にただのテーブルと言う意味なら質問者はマスタやトランと並べて質問しないだろうね。
質問者はそのくらいDBについて分かってないだけでしょ。
>結局、関連テーブルに対し適当な名前が付けられていない。
「関連テーブル」でいいじゃん。
>単にテーブルと呼べば関連テーブルを指すと言うケースがある。
非常に特殊な低レベルのバカの場合だけだろ。
「リレーションテーブル」は正確ではないけど意味も通じるしいいけど
「マスタテーブルとディテールテーブル」を「マスタとテーブル」と表現するのは
だめすぎだよ。
> 関連テーブルは英訳すればリレーションテーブルになってしまい、これも適当な用語ではない。
relationship tableではいかんのか?
T字形だと「対照表」と呼ぶよな。
ネットで初心者が用語を混同して質問しているのをいくら挙げられても、なんにもならないよ。
ふと思ったけど 「マスタとテーブル」って汎用機時代のオッサン用語だったりするかも。
>>129 >質問には「普通のテーブル」って書いてあるよw
その質問者が普通のテーブルが何を意味してるのかが分かってないから聞いてるんだよね?
俺が挙げたのは用語を混同している初心者の質問でなく、
用語を混同して設計されたDBの保守作業をする事になった初心者の質問だよ。
実際俺も保守作業において、実際のテーブル名及び設計書でそういう用語が使われていて知った。
事実、その用語を紹介しているサイトも紹介した。
マイナーだとしても認知されている用語なのは間違いないと思うが?
カタカナ化せず関連テーブルと呼ぶなら、
mst_ trn_ とつけて kanren_ってつけるの?
それとも普段からの呼び方は「関連テーブル」で設計書上では「rel_」とするの?
>>123 >
>>121 > 酷すぎるという根拠は貴方の主観以外にあるの?
正しい事が書いてある項目を見つけるのが難しいっす
>>132 そのサイトに書かれている項目のうち何割が間違っていますか?
偏りが発生しない方法で20件程度を抜き出して答えてもいいです。
それをしないうちはサイトに対する信憑性の低さを根拠には出来ないはずです。
俺の認識では、確かに誤用かもしれないが確実にこの用語で作られたシステムはかなりある。
かなりのエンジニアに通じる。
全く認知されていない「勝手な用語」であると思えてしまう人が居るのは、単に知らないだけ。
と言う認識。
>>131 "rel_"とか"r_"とか"kanren_"とかなんでもいいけど"tbl_"とはしないよな。
ダメ設計者が関連テーブルに"tbl_"と接頭辞をつける事例はあるんだろうけども
それは積極的に「関連テーブルはtbl_とつけよう」とした訳ではないと思う。
ほんのちょっと、ほんのちょっとだけでも論理的に考える頭を持っているならば
「関連テーブルはtbl_」なんて考えるわけがないし。
>>133 >この用語で作られたシステムはかなりある。
じゃあ俺が寡聞にして知らないだけなんだろうね。
なるべくならそんな「エンジニア」さんとは仕事したくないけど。
件のサイト、20件とかメンドクサイです。ただこの先参照する時には
眉につばをつけてみる、本を読んだり他で調べて自分で考えてみる、
ということをお薦めします。
スクリプト言語 = 文法が簡単なプログラミング言語
シーケンシャルファイル =「1行1データ」で表されるデータ。
トランザクション・ファイル = プログラムの処理の過程で削除されてもよいファイル
オブジェクト指向 = 既にあるものを組合せ、短期間でよりよいプログラムを作ること。
追加。これももちろん違う ■テーブル マスター・データの関連データを格納したファイル またの名を「ディテール・テーブル」
>>135 というか汎用機時代はそうだったのかもしらん
>>130 汎用機出身のオッサンはテーブルのことを「ファイル」と呼んだりするからあなどれないw
>>134 >スクリプト言語 = 文法が簡単なプログラミング言語
これは間違ってはいないと思う
139 :
NAME IS NULL :2008/11/26(水) 23:24:13 ID:v/u6t0ex
>>133 >そのサイトに書かれている項目のうち何割が間違っていますか?
>偏りが発生しない方法で20件程度を抜き出して答えてもいいです。
>それをしないうちはサイトに対する信憑性の低さを根拠には出来ないはずです。
なんという上から目線www
>本来の意味通りのテーブルならテーブル名の接頭辞にする意味ないからね。 テーブルなのかビューなのかファンクションなのか接頭語で分かるように テーブル(オブジェクトとしてテーブルに分類されるもの)には全てT_を付ける、とか 珍しくも無いと思うけど。
>>141 それやるとDB側だけ変更でテーブル→ビューって置き換えた時にT_XXXってビューが出来る。
>>116 そんなアホサイトじゃなくて書籍を買って読んでみなよ。
お母さんにお小遣いもらってさ。
なんか実務経験とかがロクになさそうな厨房が 俺ルールを押し付けるスレって雰囲気だな。
どの辺が俺ルール?
コボラーのときは本当にテーブル単位でファイル弄ってただけ。
>>147 だからってRDBのテーブルを「ファイル」って呼ぶなよ
テーブル操作=ファイル操作だから同じ事。
ファイルメーカー
COBOLから見るとまったく同じに見える ミドルウェアってえらいね 横に長いテーブルまんせー
殺意が沸いた
実務の世界にいないのでどのような確執があるのか見当も つかないのですが・・・ かつてDB屋さんとコボル屋さんの間で血で血を洗う闘争でも あったのでせうか((;゚Д゚)ガクガクブルブル
現在も戦いは続いている
>>155 メインフレームDBとUnix系RDBとだろ。
前者で使われている言語は主にCOBOL。
後者で使われている言語はかつてはC、現在ではスクリプト系言語などさまざま。
Unix系RDBの登場は1980年代で日本で普及しはじめたは1990年前後から。
メインフレームDBはもっと歴史が古くて1970年代から実用化されていた。
メインフレーム=COBOLのほうが20年以上先輩であるわけだ。
メインフレームDBで古くからあるものはRDB=リレーショナルデーターベースではない。
階層データーベースを使っているものが多い。DBをアクセスするためにミドルウェア
が存在する。
まあ、歴史的にはこんなかな。とメインフレームを知らない俺が言ってみる。
階層データーベースにはテーブルというものがない。「ファイル」というのはそのせいか。
ものが
あって、
かゆ うま
別にCOBOLと言う言語が悪い訳でもないとは思うが、 コボルを扱う人間の設計には欠陥が多いのは事実ではあるな。 オマエラは一生20年前のシステムのだけ見てれば文句はないのだが、 現代のRDBのシステムにクチを出してくると、ほぼプロジェクトは火を噴く結果になる。
「俺たちの戦いはこれからだ」的な実情ですね。大変だなぁ。 先ほどの「横長のテーブル」もそういうCOBOL畑だった人が持ち込みがちな 「困った設計」なのでしょうか。 単に正規化に無頓着なのか、それともまた別の異なる設計論があるのか、 まるで異文化コミュニケーションですね。
ある程度、先入観が混じっている見方だけど、 メインフレームを使う金融系COBOL畑と言うのは、技術畑のエンジニアが やった仕事ではなく、大昔のIBMのテンプレートを真似ただけの、 マニュアル仕事であって、競争とかそういうのは無い狭く閉じた世界の 物語と言う感触がある。 昔は昔なりの事情があるから全否定はしないけど、 老人から「俺は昔こんな事をしたんだぜ」と自慢げに話されても 「ふーん、大変でしたね」と言う感想しか沸いてこない。 JavaとかC#,Python,Rubyなんかは過去の反省と言うかそれなりの 理想を持って進化している言語であり、それらを選択するエンジニアは 「過去よりは少しはマシに」と言う未来に向かって試行錯誤するタイプなんだけど、 COBOL畑の人間は「俺はこう教えられた。俺は今までコレでやってきた。 これ以上俺は何も覚える気がない。俺は正しい」と人間的に 成長が止まっているタイプが圧倒的(w)に多い。 さらにヤやこしいのが金融系と言う仕事が謎なステータスがあり、 そこでCOBOLがある程度ブイブイ言わせているので、COBOL畑の 人間が高給取りかつ増長している現実がある。
つかCOBOL馬鹿にするだけで、開発自体まともに理解出来てない奴がいるな。
「俺は昔こんな事をしたんだぜ」 が自慢だけならいいが 「俺は昔こんな事をしたから、これからもこれでOK」 というおっさんが権力だけ持ってるのがうざい
昔と今で技術に隔絶の差があるのになぜおまえらはおっさんにそれを伝えることができないの?
>>164 そこまで力がないからでしょ。
力があって理解せられてれば自慢じゃなくて添削依頼になる。
添削依頼なんてならねえよ。社内上の立場ってもんがあらあ。 簡単にウン10年の情報化の歴史を小僧っこに否定されてみろ。
そんなこんなで日米の証券システムは、乳母車とスペースシャトルに例えられるくらいの差がついてしまったわけで
>>166 普通にされてるんだが・・・自分より10以上離れた年齢の人に。
そうでもないと思ってたがずいぶんとマシな所に勤めてたようだ。
ピコーン
悲惨な前線での戦闘の話を聞き、自分の身の上が恵まれていることに
気が付いた
>>169 であった・・・。
>>161 残念だが、そういう人間はCOBOLやJava、C#にかかわらず非常に多い。
実際COBOLって方言が多くて、年代や機種によってさまざまに変化しているから
1つのシステムだけを延々やってた人以外は、毎回やり方を変えていたよ。
#メインフレームだと新機能を使わないってルール付けしてたりもする。
システムそのものも、100万件以上ならDBをキーをつけて並び替えて抽出するより
前件なめて、ソートして抽出したほうが早いという時代から、やっぱりちゃんと
抽出したほうが早いって切り替わる時期でもあったので、こちらでは常識でも
あちらでは非常識がまかり通っていた時代だよ。
>さらにヤやこしいのが金融系と言う仕事が謎なステータスがあり
こんなの金融に限らずどこのシステムにもある。
JavaやC#で代替できないものはないし、そこだけJavaからCOBOLを
呼び出して実行してもいい。
どんな仕事の仕方をしてきたかで決まるのであって、どんな言語を使うかではない。
>>163 20年前からそうだよ。そんなやつは今も昔も変わらず多い。
>>168 砂利を運ぶのに「カウンタックを作れ」と指示されて、カウンタックを作っちゃう日本と
ちゃんと目的にあったカスタマイズされたダンプを作るアメリカとの違いだよ。
JEFをUNICODEに完全に変換できないのが悩み。DB関係ねえ。
20年後「俺がやってたC#ではな・・・」と自慢話をして、煙たがれる人もいるだろうな。 でもどうだろうな、技術というものはいつも同じスピードで進歩するものでなくて ある時期に急激に進歩してその後停滞するものであるから IT関連の技術は、今後20年間あまり変わらないのではないかな
>>174 まだまだ変わる思うよ。
次の劇的な変化は、関数型言語が実用的なレベルになるくらいにハードが進化した時に来ると思う。
つか、今現在CやUNIXでそういうパターンの奴はいて、本人は気付いていない というのがあるだろ。 COBOLerも、自分の技術は普遍的でメインストリームで、そこいらのPCのような おもちゃとは違うと信じているし、それが時代遅れだとは露ほども考えていない というのはおんなじだな。
DBはどうでしょうか。Relational database model自身はもうすぐ40周年 ですが、この次に別な何かは来るのでしょうか。
SQLを使わないデータベースが出てくるんでしょうかね オブジェクトデータベースというのはどうなんでしょ
xmlを扱うデータベースは今までのRDBと毛色がやや違う程度で チマチマ普及すると思うが、メインはRDBだと思われ。
色々言われ続けながらも結局生き残ったもんなァ・・・
db4oもサンプル見るとすげぇって思うけどちょっと調べると・・・
今扱っているDBスキーマには何十個もテーブルがありますが、 全てのテーブルでカラム数が2です。 スキーマ設計の欠陥でもネタスキーマでもなく、カラム数は 2で固定、という仕様のDBMSなのです。 このやり方でも大抵のデータを表現できる自信はありますが、 このやり方の時代が来ることも、また無いような気がします。 (内心は、あるかも、そんなときめきもちょっと感じています)
なにそれどういうDB?
>>182 そういう作りはちょっと考えてんだけど、実際にやってるとこあるんだなw
いまから趣味でつくろうとしてるOSSで試してみようかな・・・
MonetDBというDBMSです。
http://monetdb.cwi.nl/ RDB/SQLやXMLDB/XQueryを実装したパッケージとして配布されて
いますが、MonetDBのコアは二項関係だけをストアする最低限の
ストレージとそれを操作するアセンブリ言語で構成されています。
Javaアプリケーションに対するJavaVMのような、DBMSを実装して
実行するためのvirtual machineのように使えるソフトです。
大抵のデータ構造は二項関係の集合に分解して表現できるので、
目的のデータ構造を二項関係の集合に分解するルールを決めて、
後は使いたいクエリ言語をアセンブリ言語に書き下すコンパイラを
実装「出来れば」どんなデータ構造もクエリ言語もどんと来い、
そんな考えのDBMSです。
研究ではRDBやXMLDB以外にもGISやRDFDB/SparQLなんかも
実装しているみたいです。
実用向けではなく実験的なDBMSですが、SDSSという天文分野の
大きなDBをこれに乗せるプロジェクトも走っているようです。
更新系は弱いですが、参照系に関しては商用DBも上回ることも
あるようです。
バッチ処理に一晩コースだな。 リアルタイム更新のインターネット用途は不適っぽいな。
仮に20カラムのリレーションが欲しければ代わりにテーブル20個 作っちゃえ、というやり方ですから行単位で参照したり更新したり というOLTPアプリでは既存のRDBMSの実装の方が優れます。 基本は参照のみ、集約値の計算等のためにフルテーブルスキャン を多用する、しかもどんなクエリが来るか事前に読めない(クエリを 決めうちしたIndexやMaterialized viewを使うことが出来ない)用途 を意図した設計のようです。 なのでOLAPやData mining、学術用のデータ解析など向けですね。
設計の自由度は高いでしょうね。 性能は悪そう。
つーかなんだな OODBって結局一度もブームこなかったな ポストRDB!!とか騒がれていたのに
だって遅いし。 実データをオブジェクト指向で扱うのって無理が有りすぎる。無限に要素を想定する事に成るし。 加工するにはオブジェクト指向で操作したほうが直感的では有るけど。
なんだかんだでSQLって良く出来てるよなぁ ORでインピーダンスミスマッチとかよく言われるけど、 SQLからクラスとマッピングコード生成するスクリプトを書けば いいだけだしな 何もDB自体がOOである必要はねーよ
カラム数が2だとキーと値を持たせたら終わりじゃないの? A りんご A 100 A 青森産 B みかん B 150 B 愛媛産 みたいに。 「このレコードは名称、このレコードは値段」とか判断付かなくない?
「あれができない、これもできない」っていってたらキリがないだろw
そうだな。 判断付かなくて困るって程のことでもないし、いいのか。
>>193 カラム数は2で固定ですが、テーブル自体は沢山作る事ができるので、
この例だとキー:名称、キー:値段、キー:産地の三つのテーブルを作るのが
一つの解です。
各テーブルでキー->名称、キー->値段、キー->産地の関数従属性を表現
出来て、これらの三つからキー->(名称, 値段, 産地)の関数従属性を導出
出来ますから、この分解は無損失です。
組織マスタ 組織 上位組織 社員マスタ 社員番号 役職 権限マスタ 権限 とあるときに、ある社員の役職が自分の所属する組織だけで通用する 権限を持たせるようにするにはどう関連を引けばいいの?
外部キー無いじゃねぇかw
200 :
193 :2008/12/06(土) 21:36:41 ID:???
>>197 あー、そりゃそうだ。
名称と値段と産地が同じテーブルに入ってるという普通のDB的考え方がそもそも違うのか。
まあ総当たりで再利用考えなければwww
>>200 MonetDBもSQLを使えば普通にnカラムのリレーションを作れますよ。
JDBCやODBCもあるので、ただRDBMSとして使う分にはMySQLとか
その辺のOSSのデータベースサーバと変わりません。
なんかMonetDBがとても普通でない変態DBみたいな誤解が生じても
アレなので、念のため。
2カラム限定なのは低水準のアセンブリ言語を直接使って変な事を
する時だけです。変態なのはDBMSではなく、私。
203 :
NAME IS NULL :2008/12/09(火) 22:31:44 ID:8rN2YWi9
すいませんトーナメント表を作りたいのですが DBはどのように設計したらよろしいでしょうか? こんな感じのドラゴンボールの天下一武道会みたいなトーナメント表です 優勝 | |~~| |~~~|~~~| A B C
>>203 俺なら一試合一選手で1レコードにしてこうする
PK ID
対戦相手ID
X回戦(一回戦とか二回戦とか)
X試合(第一試合とか)
選手
勝敗フラグ
と思ったけど勝ち上がった後のキーもいるかな。 このやり方だとトーナメントの下から追うのはいいが上から追えないが。。。
206 :
NAME IS NULL :2008/12/10(水) 19:07:05 ID:8RNJEsTT
ちょっとみんなの意見をききたい 休日マスタのような、主キーを日付にしたいけど、時間はいらないってときに、 日付型でやる?数字か文字でやる? 日にちのみのと時間のみの型があるなら日にちのみの型でやるんだが、 日付型って時間とセットなんだよなぁ 日付型で時間入らないように制約つけるのがベスト?
レスしてもいいが貴様の態度が気に食わない
MSSQL2008なら日付単位でもてる
日付型でやった方が型で制約つけれるし 日付関係の関数が使えるので日付でやる 変に文字列とか数値とかでやると後で型をキャストする必要がある時めんどいし。
>日付型って時間とセットなんだよなぁ そうでないRDBMSもあるんだから、そういう環境依存な話されてモナー 漏れは日付は日付型を使う派。 そうしておかないと、あとでCOBOLerの様な人種が「9999-99-99」とかトンデモ日付を入れて アプリでトンデモ実装をやりはじめそうだし。
>>210 むしろその制約のために日付を無理やり文字列管理ってDBがいかに多いか…
212 :
206 :2008/12/11(木) 20:16:12 ID:???
>>208 2008はデータ型増えてるのか...
>>209 確かに日付関係の関数は便利だな。
自分で日数計算とかやってられんな
>>210 俺の中では、日付型は日にちと時間せっとなのがスタンダードで、
日にちだけとか時間だけとかの型があるほうが特殊だと思ってた
まあ、どっちにしろ環境依存といえばそうなんだが、
それ言いだすとまず環境を決めないと設計語れないしな
>>211 すまん、よく意味がわからん。
9999-99-99を入れたいがために、文字列で定義されているシステムが多いってことか?
まあ、やはり日付入れる項目には日付型使うほうがよさそうなんで、
やっぱりその方針でやるよう検討するわ。
>>212 > 9999-99-99を入れたいがために、文字列で定義されているシステムが多いってことか?
2000年問題で有名になったYYMMDDというのがある。
214 :
206 :2008/12/12(金) 00:19:34 ID:???
>>213 いや、あるのは知ってる。YYnnnとかな
DB使わない、それこそコボラーな世界では普通だった。
その世界ではそれが間違ってるとは思ないが、
DB設計としてはどうなの?って話だ
いまどきメモリの1バイトは血の一滴ってわけじゃあるまいw
日付で思い出した問題ですが、例えば リレーション社員<社員ID, 入社日, 退職日>に対して、 (社員1, 1/1, 4/1) (社員2, 2/1, 6/1) (社員3, 4/2, 8/1) (1) self joinして、在職期間が重なる社員のペアを抽出する (社員1, 社員2) (社員2, 社員1) (社員2, 社員3) (社員3, 社員2) (2) 日付の期間でGROUP BYして社員をcountする事で、 リレーション在職者数(人数, 日付from, 日付to)を求める (1人, 1/1, 1/31) (2人, 2/1, 6/1) (1人, 6/2, 8/1) なんてクエリは、実務ではどのように実装しているのでしょうか? こういうTemporalな演算を標準SQLで頑張る論文を読んだことがありますが、 結論は「出来ればこういう演算はDBMSで直接サポートしてくれぇ」でしたw
(1)はDATEDIFF関数で。(ORACLEとSQL Serverで若干書式が異なるが) (2)は普通に入社日と退職日でGROUP BYしてCOUNT取れば出来ないか?
>俺の中では、日付型は日にちと時間せっとなのがスタンダードで、 ソレって主にOracleの事情だったっけ? DB2,Postgre,MySQLは日付と時間を自由に出来たはずだが。
SQL Serverも2005までならそうだと思うが
普通32ビットだから、時間も一緒でしょ。 別に二つカラム持って、こっちは日時しか見ない、こっちは時間しか見ないでもいいと思うが。 どうせ日時の二倍データ量使うでしょ。 1バイトでも件数大量なら無視できないけどな。 オープンソースとかで安易に電網鯖構築してるとレスポンスめちゃめちゃ悪いサイトが出てくるのはそんな理由も大きい。 商品情報とか数万件じゃ済まないし。
>普通32ビットだから、時間も一緒でしょ。
ナニを言っているのかよく解らんが、Oracleは間違っていないとか
そういう類の発言のつもりか?
DB2のDATE型は'2008-12-13'と10バイト使う(Verによりやや違うが)が'0000-01-01'〜'9999-12-31'まで許す(紀元前は不可能)
MySQLのDATE型は'2008-12-13'で3バイト使うが'1000-01-01'〜9999-12-31'しか許さない(のワリに'0000-00-00'を許すんだよな、意味は解るけど)
ナニが普通なのか知らんが、
>>219 の偏った知識の持ち主が「レスポンス云々」を
語るのは不思議な感じなんだが。
メモリの1バイトは血の一滴ではあるまいに、は賛同するが、
RDBMSを使う要件の多くは「数万件ですまない」ケースがほとんど」だしなー。
>>215 (2)は日付テーブルを持っておいて、1日ごとにジョインしたあとにgroup byして…
とかで出来そうだけど死ぬほどパフォーマンス悪そう。
プロシージャとかで必要に応じてデータ作るのが現実的な気がする。
timestampはデフォ32ビットでおま。
>>221 (1) は社員AとBの在職期間のoverlapを判定するには合計4パターン
(A-B-B-A, A-B-A-B, B-A-B-A, B-A-A-B)を条件として書く必要が
あって、なので単純なDATEDIFF関数では力不足なんです。
Postgresにはその名もOVERLAPSという関数がありますが、こういった
関数を持たないRDBではどうしているのかなと。
(2)については、各社員の入社日・退職日を境界として全期間を細かく
ぶつ切りにして、個々の期間について各社員の在職期間とのOverlap
を判定して・・・と、さらに面倒な処理が必要になります。
いずれにしてもSQLで書くには結構大変なクエリで、でも実務の現場
では案外良くありそうなクエリなので、どうやって実現しているのか
興味がありました。やはりストアドプロシジャでゴリゴリでしょうか。
224 :
206 :2008/12/14(日) 07:24:05 ID:???
>>219 前半いわんとすることが全く理解できないんだが...
日付型が時間とセットでしか格納できな処理系で、時間を設定しない項目に
日付型を使うか否かというのが論点だったんだが...
>1バイトでも件数大量なら無視できないけどな。
これには同意
ただ、数万から数十万程度の件数でレスポンス悪化するようでは、
そもそもの設計がおかしいと思うぞ
>>220 RDBMSのオーバーヘッドを避けるためにDBをつかわないシステムを見たことがある
つまり、DBつかう以上ある程度のオーバーヘッドは了承の上だと思う。
日付型が文字や数字より(DBに格納する上で)ある程度のオーバーヘッドが生じるわけだが、
百万件オーダー程度ではあんまり考慮しなくていいかとおもってるんだが
>>222 それってどんなDBMSでもそうなのかね?
まあ、はじめに処理系依存な話をしだしたのは確かに俺だが、
特定のDBMSでしか通用しない話は、そのDBMSを明示してくれないか
ついでに聞くが、デフォで32ビットってことは、変更も可能ってことかね?
>>223 在職期間の重なりを判定するならこれで十分だろ。
(A.入社日 < B.退社日 and B.入社日 < A.退社日)
(2)も、集計期間のリレーションが用意されているなら同じように可能。
226 :
211 :2008/12/14(日) 08:13:55 ID:???
>>212 すまん、遅レス。
俺が遭遇したのでは
「値が未設定の項目はHigh Valueをセットしましょう。日付のHigh Valueは99999999です」ってのとか
「99999999にしておきゃ日付範囲の検索時に有効だろうがJK」ってのとか
いずれにしろなんだその言い訳?みたいのばっかだったよ。
特殊パタンだと
「2008-12-32」を入れておきたいとか、「26:59:00」まで一日の範囲にしたいってのもあったな。
>>222 >>224 >timestampはデフォ32ビットでおま。
DB2のTIMESTAMP型は10バイトな。
Oracleは12バイト。(Verや使い方で9-11バイト)
日時関連の型は処理系や実装は各RDBMSでけっこう違う。
DB2だと'20081204'をINSERTすると例外出すが、MySQLはOKとかな。
>>226 まあ、日付は日付以上の意味はない罠。
判定したけりゃnullかどうかで判定汁。と言うのがDB屋としての回答ではある。
DB2だとINSERTの時に不正な日付は例外だすから、そこらは安心だ。
MySQLだとINSERTをスルーするから後の結果が怖いな。
#違っていたらツッコミヨロ
228 :
206 :2008/12/14(日) 17:43:40 ID:???
>>226 その手の話は、コボラーの時代には普通の設計だったな
まあ、未設定なら俺ならLow Value入れるがなw
特殊パターンは悩みどころだな
だが
>>227 が言うように、
>まあ、日付は日付以上の意味はない罠。
>判定したけりゃnullかどうかで判定汁。と言うのがDB屋としての回答ではある。
というのが正しいスタンスなんだろうな
結局のところ、日付以上の意味合いを持つものを一つの項目に格納しようとするからそうなる
DB設計としてはそれはやめるべきだろうと理解した
ちなみに、たとえば、有効期限みたいな項目があったとして、
期限日が入ってる場合以外に、未設定と永久があって区別したい、とか言うと
未設定はNULLでいいとして、永久ってのは別途フラグかなんかで項目作るのが正しいDB的設計?
9999-99-99がでふぉ。
その日付型が持つHIVALでいいんじゃないのか? '9999-12-31'と'9999-99-99'なんて現実的に同じ意味だし。 ただ単に9999-99-99を許すと今度は8888-88-88とか使いだすだろうし。 そんなつまらん理由の為、日付型の美味しいところを捨てるのはワリに合わんだけだし。 しかし、そういう実装はCOBOL等のバッチ屋はアタマ使わなくて済むかも知れんが、 UIを担当する部署(Webチームとか)から「ふざけんな」と言われるのがオチなので、 フラグで持つ方が親切だろうなぁ。 Web系のフレームワークと連動させるケースだと'9999-99-99'の実装は殺意しか 沸いてこない。 まあ、ここらも現代においてCOBOLerが嫌われる要因のひとつでもあるな・・・。
231 :
211 :2008/12/14(日) 21:31:32 ID:???
>>230 すげえ、あたりww
後から High Value 2 って規格ができたよ。
もろ8888-88-88だった。
バッチ組の仕様でHigh Valueでも2タイプを判断しなくちゃいけなくて云々と説明されたけど、理解不能だったorz
UI側はただただ面倒臭くてたまんなかったわー。
他の項目の状態判断して、設定するHigh Value値を切り替えなきゃいけないんだから。
まあ、あいつらが'9999-99-99'や'8888-88-88'を好むのはメインフレームやらのホストの流派を組んでいる からある意味仕方ないのはあるな。NULLと言う概念は存在しないし、データには なんでもヘッダ(01)、データ(10)、トレーラー(88,99)とかつけたがるし。 COBOLerにはSQLにある3値論理が理解できんのだろう。 コレもRDBを操作するSQLの基礎だと思うが、COBOLerはRDBを操作するのにSQLを使わないケースがあるし。 とは言え、RDBMSなんだからCOBOLerがSQLやらフレームワークを考慮してくれないと困るんだが あいつらの上司はモノを知らんくせにやたら立場と態度がデカいのがウザいったらありゃしねぇ。
233 :
206 :2008/12/16(火) 02:13:45 ID:???
>>232 >データにはなんでもヘッダ(01)、データ(10)、トレーラー(88,99)とかつけたがるし。
さすがにそれはお前のとこだけだろうと思うが
>とは言え、RDBMSなんだからCOBOLerがSQLやらフレームワークを考慮してくれないと困るんだが
まあ、COBOLとRDBっていまいち相性悪いよな
そもそもCOBOL全盛のときはDBは実用的ではない場合がほとんどで、
DB導入するならCOBOLもやめて作り直せば良いんだが...なかなかそういかない現実がある
店舗ごとの品目売り上げ実績一覧テーブルがあるのですが、 品目一つに対して一列になっているため、 品目の調整がはいるたびに大変な状況です。 実績は金額、件数、率を含んでいるため 単純に列を行に移し替えることはできません。 こういった場合、実績の単位ごとにテーブルを分けて 管理するといった方法でよいでしょうか? 言い忘れてましたが、実績には対応するコードがあり それで特定可能です。 (今はなぜか列名にそのコードが設定されていますが…)
>>232 COBOLerはCOBOLerで、「なんでCODASYL標準のDBMS使わないんだよ。」
と思っている希ガス。
店舗マスタ(店舗コード、店舗名、住所・・・) 品名マスタ(品名コード、品名、値段・・・) 実績テーブル(実績コード、店舗コード、品名コード、実績、・・・) こんな感じ?
現状だと 実績一覧テーブル(みかん金額、みかん件数、みかん率、りんご金額、りんご件数、りんご率…) になっている、という話?
>>236 ,237
今の構成としては
YYYYMM、店舗コード、実績001、実績002、実績016、実績003…
といった感じです。実績列の名前末尾三桁が実績コードです。
つまり、品目を特定するキーがないのが現状です。
前任者の意図としては、web側で出力するのに
SELECT一発で出せるようにということのようです。
>>236 さんの方法ですと、実績の単位の型ごとに
列を持つことになるかと思います。
実績_金額、実績_件数、実績_率のように。
この場合、1レコードに対して、必ず2つのNULL列が出ますが
設計上良いものでしょうか。
他に案も浮かばないですが…。
金額か件数か率かは実績コードから決まるんなら 実績テーブル(実績コード、店舗コード、YYYYMM、実績) でいいんじゃない? これをクロス集計すれば一発だと思うけど
>>239 はい、単位は品目コードで一意に識別できます。
今日ちょうどリーダーに同じ案を出したのですが、
違う単位の実績を同じ列に入れることに少し難色を示されました。
(実績単位ごとの列、テーブルを設けるという案でも同じような反応でしたが)
でも、
>>239 の方法が一番シンプルに
まとめられるやり方ですし、また話してみようと思います。
ありがとうございました。
どんなデータの集合体であればマスタとみなすのでしょうか? イベントとリソースの分類で定型的な手法ってありますか?
242 :
NAME IS NULL :2008/12/20(土) 05:53:23 ID:4lEGcef7
3つ以上のテーブルをjoinする場合、 一般的にどういう順番でjoinするのが速いですか?
>>242 大きいテーブルを先に持ってくる。
実データの入ったDBで計測するのが一番。
244 :
NAME IS NULL :2008/12/21(日) 04:57:19 ID:Qp++Fn0M
過疎だメシウマ。 ところでテーブルに画面表示用のデータ入れたカラム容易したり、 アプリ依存の使いまわし効かないようなデータ入れたりって皆さんしてます? DBの勉強は一通りしてみましたが、実務に当たってこのあたりの良し悪しに悩んでます。age
普通はやるべきじゃない。 結果セットに直結する形のフォームや帳票のコントロールのせいで そういう作りにしてしまってるものを見ることがあるが、 これは、ある種のバッドノウハウの類。 オンメモリで処理しにくいものだったらローカルDBを活用したらどうだろう。
246 :
NAME IS NULL :2008/12/21(日) 15:34:35 ID:Qp++Fn0M
>ローカルDB 成る程です。 例えば、DBサーバとAPPサーバが別々に存在したとする。 APP依存、固有のデータに関してはAPPサーバ側にローカルDBを構築して活用する感じですかね。 仮に予算や客都合でローカルDBを用意できない場合は、 せめてテーブルを切り分けて管理したいと考えてます。 しかしJOINが重なるとパフォーマンスや管理の面で劣る… なかなか難しいですね。
SQL ServerのExpress Editionをその目的に使ったことがある。 他にもSQLiteとかSQL Server Compactがそういう目的に使える。
ローカルDBって、そんなのクライアントごとに固有の情報を保持するとかでもなきゃ
使わんだろ?サーバーサイドでわざわざ複数のDBに分ける理由はない。
>>246 の別テーブルでというのが普通。その上で、アプリ固有の情報といっても
変更の可能性が低くて1:1あるいは1:0リレーションシップであれば1テーブルに
まとめてしまうくらい。
>ところでテーブルに画面表示用のデータ入れたカラム容易したり、 >アプリ依存の使いまわし効かないようなデータ入れたりって皆さんしてます? やらないし、やらせない。 それをやりだすと、アタマの悪い後任者が「ここにこのデータがあるから、コレ使えばいいじゃん。 オレ賢い!」と勘違いして、データベースの基本の「One Fact In One Place」の 理念がパーになる。そして黒歴史が始まる。
一時表ならよくね?
表示順とかどうすか
252 :
NAME IS NULL :2008/12/22(月) 19:20:00 ID:7uJOOUG4
一覧ソート用とか
>>249 まともなドキュメントが作られてない or 作られていても後任の教育ができていない場合なら
そういうのも考えられるけれども、まぁ、設計の問題というより組織の問題だな。
現実問題、組織の問題を言い出すと、外注丸投げや派遣ばっかなご時勢で マトモなドキュメントやら教育云々なんて絵空事だよなぁ・・・・。 そういうった組織を含めて「システム」と言うのだと思うが。 それにアタマの悪い管理者ほど「マニュアルがあれば誰でも出来るだろ」と 言い出す始末だしな。 「○○が出来ていれば」なんて絵に描いた餅なんて食べられないよ。
手元にあるのはERDと現物のDBのみ、 カラムのコメントは歯抜けだらけ、 アプリの仕様書もない状態。 「このアプリの仕様を踏襲した新システムを作れ」 見えないルールを予測するエスパーたち。 誰かが言った。 「DBがシステムそのものだ」と。 そんな事判ってる。 ならせめて、そのDBの利用ルールを網羅した仕様書を用意しておいてくれ。
>>244 の
>画面表示用のデータ入れたカラム
>アプリ依存の使いまわし効かないようなデータ
ってそれぞれ具体的にどんなの?
だから表示順なんかどうすか?と。
表示順は無いとどうしようも無い場合も有るから 要・不要を語る意味が無いと思う
要・不要の観点で誰も話してないと思うよ。 仮に同一DBを利用するアプリが増えた場合、 設けた表示順が利用できず、新たに用意する事もありえる話。 これってまさしくアプリ依存だよね。 で、この依存したデータたちをどう扱うべきかって流れかと。
じゃあ
>>244 への回答は
「してまーす」でいいわけね。
他にいい方法ないもんですかねー。
>>259 よくわからん。
マスタとかを別とすれば基本的にテーブル自体アプリ依存とかだと思うけど。
将来有るか無いかわからない他のアプリでの再利用とかまで考えるのがおかしな話だと思う。
ユーザーや端末依存の情報は他のテーブルと区別している。 他のテーブルと結合させないで、専用のクラスや関数でラップして読み書きさせてる。 たまたま、同じデータベースに同居しているというイメージ。 パラメータ系のテーブルもこれに倣っている。
>>261 特定アプリだけの専用DBなら、画面プログラマがO/Rマッパで生成するDBで充分だろう。
業務システムの場合、組織・人・商品のような共通データを一元化するべきだから、
きちんとDB設計することが重要になる。
>>264 マスタは不変の固定情報だけにしないと、時系列のデータを扱った時に矛盾してしまう。
例えば人の場合、生年月日はマスタ上の固定データで良いとして、
配属情報なんかは日々のトランザクションの中にあるわけで、
これを例えば、社員マスタに所属部署の列なんかを作って、常に最新の配属情報で
上書きしたら、そのテーブルは今日のデータとしてしか使えないし、兼務情報も得られない。
実際、いろんなアプリで共通に使うデータの多くがトランザクション上にあるから、
やはり特定アプリの表示用データなんかをDBに置くことには危険がともなう。
マスターテーブルにカラムを追加するのは問題だが 特定のアプリ用の独立したテーブルを作るのはいいんじゃないか
だね。 スキーマ分けて権限で制御とかなら分かるけど DBに置いちゃダメってのは行きすぎだと思う。
>特定のアプリ用の独立したテーブルを作るのはいいんじゃないか それこそDB上に保持する理由が解らんな。 テンポラリテーブルやPCのローカル上に落として好き勝手やるならともかく。
思いつきなんだけど、hsqldbやfirebird,h2,oracle liteなんかの組込DBを、 今議題になってる各アプリ専用のDBとして、 基幹系DBと独立させる設計はどうだろう? 今、業務で扱ってるDBが監査用の設定が入ってて、 DDLとか大量検索が走ると警告メールが部署内に飛び交うんで、 あんま基幹系DBのスキーマを弄りたくない空気があるんだよね。
>>268 テンポラリテーブルやローカルDBじゃセッション間、クライアント間で共有できないだろ。
もしかして、そういう共有する必要のあるデータは全部「アプリ依存」じゃないと考えているとか?
>>270 クライアント間で共有と言う時点でその設計が糞だと言ういい証明なワケだが。
でもニーズとしてはクライアント間で共有したいって言われるのは自然。 そこでばっさり切り捨ててあいつ使えないなと思われるか、何か工夫してあげてあいつ神と必要な人間に評価されるかは、これからの正社員リストラで生き残れる分かれ目だったり。 組織の運営上は、きちんとマニュアル整備して、誰でもマニュアル通りに対応する体制にしてないと、監査も通らないし危機管理上もマズい。 情報やノウハウを属人化させてるから、退職だので、前任者居なく成ったとたんに困るんだよ。
「特定のアプリ用のデータ=共有の必要が無いデータ」で 「共有が必要だとすると設計がクソ」か。 またとんでもない決め付け厨が現れたもんだ。
学生かなんかなのだろう
>>272 具体的にどんなニーズなんだろう。
なんかエンジニアが実力不足を言い訳で乗り切ろうとしているだけにしか見えんが。
実力があれば、共有すべきデータをローカルのみに保持してても何とかなるらしいw
ちょっとわかった。 「特定のアプリ用のデータはローカルに置け」といってる人の言う「特定のアプリ」とは 「ローカルPC上からDBにアクセスして、個人的に何かをするツール」的なもののみを指してるに違いない。 それだと話が通る(というか噛み合わない理由がわかる) そのツールだけで使うデータであり、ツールはその人以外誰も使わないのであれば データをサーバーに置くべきでは無いわなw
特定のアプリの位置づけ、それが扱うデータ これがわからなければ議論はできない
なんかここの一部の人は具体例をださずに話をするのが好きだよなー。 会社の宿題をここで解決してるのがバレるのが嫌なんだろうか。 仮に前に話題に上った「特定アプリの表示用データ」なんか、 ほとんどの場合は共有するモンでもないと思うが、 「共用データをDBに置くオレカッコイイ、オレ神だぜ」と言うケースは 具体的になんなんだろう?と激しく疑問だったりする。
まあ特定アプリが何なのか詳細が分からないからなんとも。
ローカルって、端末PCのことを言ってたの? オレはてっきり、Web/Appサーバに軽量DBMSかXMLか何かでUI層絡みの データを置くのを、DBサーバに対して(Web/Appサーバの)ローカルと言ってると 思ってたんだが
>>279 逆に共用データをみんなが個別に端末に保存して
「オレカッコイイ、オレ神だぜ」って具体例を挙げてくれやw
毎日一回しか更新しなくていいけど量が膨大なデータとか? 業務アプリならその手のデータがほとんどかもしれない。過去10年分ぐらいのデータなんてほとんど更新される事も無いし。 後はアイテム数膨大なアプリとか。10万アイテムぐらいならいちいちオンラインでネット上をばんばんデ−タ流すよりも、ローカルにキャッシュして差分更新で扱ったほうが快適かもしれない。
285 :
244 :2008/12/29(月) 00:57:50 ID:???
皆さんアバウトで申し訳ない。 ローカルというのはWebアプリ視点で物申しておりましたorz=3 つまりWebサーバー上にある軽量DBやXMLなどの事です。 一応、例を提示しておきます。 [DBサーバー] DB : Oracle … 顧客情報、商品情報、販売情報、生産情報などが入っている。 [Webサーバー1] 「販売管理システム」というWebアプリケーションが動いている。 ローカルDB : Postgresql … この「販売管理システム」依存のデータを管理。 例えば、「一覧表示用の順序データ」や「検索条件」、「ログ」など。 [Webサーバー2] 「生産管理システム」というWebアプリケーションが動いている。 ローカルDB : Mysql … この「生産管理システム」依存のデータを管理。 例えば、「一覧表示用の順序データ」や「検索条件」、「ログ」など。 [端末にインストールされているシステム1] 「商品開発支援システム」というVC++で作成されたWindowsアプリケーション。
表現が悪い意味で「いい加減」「アバウト」なひとは気を付けてね いくら良い設計しても、プログラマーに伝わらなければデスマの元だよ
商品開発支援システムは直接オラクルにアクセスしてるのではなくて、販売管理システムか、生産管理システムにアクセスしてるとか? 統合して全部オラクルで共用データも含めて情報持っても良さそうだが。 システム付け足すのは簡単だっただろうけど、管理大変でしょ。あちこちにデータベース有って全部違うし。 そのうち経営情報システムとかで横断的に情報欲しい時にどこにデータが有るか探すの大変で嵌まると思うwww
業務ごとにDB立ててバラバラに情報持ち出して結びつけるキーも無くて 「なんとか統合してくれ」的なプロジェクトに参加したことがあるなー。 他社のDBの情報を利用するとか止むを得ない事情でも無ければ 分けたくないところ。
285は一見きれいに作られてる風だけど、
>>288-289 の言うとおりシステム統合とかで大変な感じ。
DB鯖にアプリ専用Tableが一番いいんじゃないかね。
teenage sex ってかんじ
そしてshotgun marriageに至と。 とりあえずシステムできちゃったから面倒見ろよと。
teenage sex って耳年増みたいな意味じゃなかったっけ? 理想論にかぶれて運用しにくい建付けにしたりってことかと。 でも最近のteenage sexは意味が違ってるよな確かに・・・
該当スレがわからないんですけどたぶんSQLスレじゃないと思うのでここで質問を。 例えで書籍のDBがあるとして書籍テーブルと著作者テーブルを著作者IDでつなげていたのですが 共著のものがでてきて今のままだと対処方法がわからなくなりました。 いちおう新たにテーブルを作って書籍IDと著作者IDを持たせ 本A=著作者A、本A=著作者Bの2レコードで表現できるようではあるのですが、 書籍テーブルとかぶって大半が無駄なように思えます。 他にうまいやりかたはあるのでしょうか。
大概の場合は結果的にそれが一番無駄のない設計になる。
そういうものなんですか。 ではこのやりかたで進めようと思います。 ありがとうございました。
一般的な多対多の解決法だね。 どうしてもっていうなら、追加するテーブルは「2人目以降のみを管理する」ことにすればレコード数は減るかもしれないけど お勧めはしない
>>295 新たに作るっていうかそもそも「著作者テーブル」がそれじゃないの?
著作者テーブルは書籍IDを含まないでしょう、多分。
>>295 言い忘れていたけど、仮に
>>295 の解決策をとるのであれば
書籍テーブルにあった著作者IDのカラムは削除した方が良い。
「書籍テーブルとかぶって大半が無駄なように」と書いてあった
ので一応補足します。
>>300 ああすまん、著作者じゃなくて295で作ったという関係テーブルのこと
>>301 それはないだろ
303 :
NAME IS NULL :2009/01/16(金) 00:30:44 ID:aohFMQX5
>>302 >それはないだろ
いやあると思いますよ。下のようにするのが一般論だと思います。
[書籍テーブル] キー:書籍コード
書籍コード、書籍名
[著作者テーブル] キー:著作者コード
著作者コード、著作者名
[書籍・著作者リンクテーブル]キー:書籍コード、著作者コード
書籍コード、著作者コード
>>303 フォローどうも
>>304 いや、301で書いたのは、単著の書籍だけの頃はきっと
[書籍テーブル(単著だけ)] キー:書籍コード
書籍コード、書籍名 、"著作者コード"
のようなスキーマだったろうから、この書籍テーブル(単著だけ)から
"著作者コード"のカラムは不要なので削除した方がよい、ということ
です。
306 :
NAME IS NULL :2009/01/17(土) 01:59:35 ID:VBakR5WF
どうだめか言ってもらえると
>309 登録年月日と変更年月日が同一のデータばっかりってな話?
あー判った。 「変更年月日 < 登録年月日」 のデータが存在するって話か。 例えば、「顧客コード」 が 000020 のレコード。
つーか、初っ端のレコードからそーなってるなw
で何のデータなの?これ
SQL(MySQL、PsotgreやMSなど特定RDBMSではなく標準的なSQL)と DB構築に関する基礎を学ぶのにお勧めの書籍・サイトないでしょうか。
SQLはポケットリファレンスで十分だと思う。 DB構築はどこを指しているかによる。
318 :
NAME IS NULL :2009/01/18(日) 01:00:56 ID:tHveqmjS
汚い設計だなあ いいからしゃぶれよ
Dateの標準SQLガイドがDate先生の辛口も読めて勉強になるけど高いよね・・・
このチンカス設計クセーぞwww 全部舐めとれよ。
スレチと言われたんでこっちで。
SQL質疑応答スレ 8問目
http://pc11.2ch.net/test/read.cgi/db/1236253554/46 >>46 正規形のなかで第1正規形だけは異質とされている通り、これだけは純粋に
モデリングと区別できる正規化とは言えないですね。第2正規形以上の「正規化」は
従属性を「保持」したままスキーマを操作するものであるのに対し、非正規形から
第1正規形にする操作は逆にリレーショナルモデルに落とし込む際に失われた
従属性を修復する操作であるとも言えるので。
いずれにせよ、第1正規形でないものは本来のリレーショナルモデルとは言えない
という意味において、それがモデリングの問題であることには違いはないということと、
スキーマだけ見てそれが正規形かそうでないか議論することはナンセンスであると
いう点では
>>46 に同意するけど。
で?
>>321 第一正規形が異質な点はその通りだと思います。
以下雑談なのでちょっとくだけた言い方になりますが、私は恩師の指導が
珍妙とくしゅだったせいか、リレーションがあまり好みではありません。
所詮は関数を実装したり表現したりする方法の一つだよね、その程度です。
なので入れ子リレーションも多値関数や高階関数ですね、そうですか、
良いんじゃない?ぐらいの認識です。
ただ非第一正規形から第一正規形を作るにはデータ構造中に含まれている
ヘンテコ関数全てにトドメを指さないといけないので2NF以下続く正規化とは
異なりデータ構造が当然大きく変化しますし、データモデリングとも絡んで
突っ込むと実は案外面白い問題だと考えています。
ただあのスレでがっかりだったのが、ただ「勉強しろ」「正規化しろ」という
コメントが続いた事です。
ちょっとひどいと思ったので
>>13 と
>>15 のスキーマを示して「データベース
理論的にどう異なりますか」と聞いてみたら「正規化について基礎から勉強
しなおそう」と返されました。おぉ〜い、もう正規形だよw
他方で誰もデータ設計については言い出さなかったので、あのような流れに
なりました。
向こうで言えない愚痴を言いたいだけならスレチ
>>321 Javaとかのオブジェクト指向な言語で、
dogクラスはanimalクラスを継承して、って学習のネタで言われるなんだろうけど、
実務で使うケースとかフレームワークが既に決まっている場合とかだと、
それらを考慮してDB設計した方がみんなが幸せになれるので、
2chでああいった質問ってほとんど意味ないとオモ。
>>324 向こうで設計の話を延々と続けたら確かにスレ違いだが、そこでの回答が
ひどかったと言うのにスレ違いもなにもないじゃん。
言ってることはむこうの「正規化勉強しろ」ってレスと変わらんわけだし。
それにしても、この板でCOBOLerを馬鹿にする人は多いけど、こういう
話題を振っても反応がそのCOBOLerと同じなんだから笑ってしまうよな。
とCOBOLerが申しております。
>>321 私には面白かったです。
2chでこんな話が読めるとは思いませんでした。
これからも時々、何か書いてくれるとうれしいです。
自分はまだよくわかってないので、勉強します。
それにしてもカリー化という言葉を、DB板で見るとは思いませんでした。
自分はHaskellとかの関数型言語で知りましたから。
関係ないけど、↓この連載は面白いです。
ベンチャー社長で技術者で
http://el.jibun.atmarkit.co.jp/g1sys/
>>329 >カリー化という言葉を、DB板で見るとは思いませんでした。
実際スキーマを理解する際に便利な考え方です。
上司の変な教育のたまものですね。いちいち数学の言葉に
ブレイクダウンしないと気がすまない人です。
彼にいわせると、GROUP BYは逆関数なんだそうです(笑)。
あとその連載、読んでます
DB畑の人間としては納得出来るところが多いです。
>>330 >あとその連載、読んでます
>DB畑の人間としては納得出来るところが多いです。
あぁ、それまだやってるんだ。
大規模システムを知らない人風だったから読むの止めてまった。
中学の図書館で簡単な読書感想文DB作ることになったんだけど 学生名から著者→タイトル→感想文表示 著者からタイトル→学生名→感想文表示 この2つをできるようにしたいんだけど、みなさんならどんなテーブル用意します? 1テーブルでいいのかな・・・?学生数は300人程です
何を管理したいかによるかな。
同姓同名のケースがあるが学生名で学生の判別してかまわないか?
出来ないなら別途学生番号を振りキーとする。
タイトルと著者を独立して管理するか?
しないなら
学生のレコードの属性として保持すればよい。
するなら、
さらに著者とタイトルの関連は管理するか?
著者に対してタイトルが複数
共著の扱い
同名タイトルや同姓同名の著者の扱いは?
感想文は学生の属性としてよいか?
学生に対して感想文は1つか?学生の共同作成はないか?
こういったところは
>>332 でないと分からん。
>>332 私ならとりあえず、こんな感じかな。
テーブル
本: (本ID), タイトル
本著者: (本ID, 著者名)
学生: (学生ID), 学生名
感想文: (感想文ID), 学生ID, 本ID, 提出日, 題名, 本文
リレーションシップ
本.本ID 1-* 本著者.本ID
学生.学生ID 1-* 感想文.学生ID
本.本ID 1-* 感想文.本ID
本のタイトルや学生名が重複しても見分ける必要がないなら1テーブルでも良いけどね。
>>333 の言うとおり、要件によるよ。
著者テーブルと 本テーブル作って 両者の関連で本著者にしないのはなんで?
>>334 横からですが、妥当なテーブル構造だと思います。
横からですが、読書感想文DBというアプリケーション自体に 興味あります。 実際に学内で何のためにどう使うのかなかなか想像が 難しい。学生名から感想文引っ張るのは何となく用途が 想像出来ますが、著者から感想文の集合を引っ張るのは はて?と。 同じ著者の本を読んだ学生間で感想文の読み比べでも するのかな。
339 :
334 :2009/03/19(木) 21:26:21 ID:???
>>335 本のデータの入力時に著者が同一人物か同姓同名かどうかは分からない(調べないだろう)から。
>>337 ありがとうございます。
>>339 なんで著者に限って同姓同名を許容するの?
同名の本や同名の学生は区別してるのに。
ましてや
>>332 の要件で著者から検索することが挙げられてるんだから
全く違う人が書いた本を一緒くたに表示するより
○○△△という著者は2人見つかりましたとかして選択させる方が良いだろうに。
341 :
334 :2009/03/19(木) 23:17:28 ID:???
>>340 私の場合、基となるデータを感想文(本のタイトル、著者名、日付、題名、クラス、出席番号、学生名, 本文)だけと想定したためです。
本はタイトル・著者名、学生は学生名・クラス・出席番号で一意に区別できるが、
著者名は、本を探してきて著者履歴などを確かめないと同一人物かどうかを断定できないと考えました。
また、本が見つからず適当に同姓同名を同じ著者として登録されても困るので、あえてテーブルを分けませんでした。
参照する側としては、確かに区別してくれていた方がより便利ですよね。
分けるコストもたいしたことがないので分けちゃって良いと思うけど。
DBの話とはズレるけど著者名かぶっちゃっていいのかな。 俺が「夏目漱石」名義で本を出したり。
時期的にペンネーム変えたりとかも有るしねえ。
>>343 ,344
それは、著作者と中の人の関係をどう管理するかの問題だな
著作者が同姓同名の別人の可能性があるのか?
複数の人間が一つの著作者として扱われる必要があるのか?
一人の人間が複数の著作者となることがあり得るのか?
このへんの要件を確定させれば決まってくる
ほかの人も言ってるが、要件をもうすこし詰めないとこれ以上の論議はむずかしいんじゃ
まあ、今回のは著作者やその著作(本)を管理するのが目的じゃないし、
著作者に対してそこまでシビアに考える必要はないと思うが
著者からタイトルの時に苦労すると思うが。
ペンネーム変えたら別著者だろ 著者単位で考えればいいのに変に人間単位で考えるなよ
入力する人間が 「この本を書いた山田太郎さんとこの本を書いた山田太郎さんは同一なのか」 ってのをいちいち調査しなきゃならん、ってのもな。 300人の中学校の読書感想文管理でそんなのいらんだろ。
そこまで言うなら、DBなんていらんがなーw
かといって、同じ著者名がずらっと並んでるのもどうかと思うが。
うわ、極論厨…
何か行ったり来たりだな。スレが無駄に伸びる
やはり仕様がないとしようがないよ
>>351 同じ著者名がずらっと並んでるってのはどういう事態を想定してるんだ?
同姓同名の著者名があったとして、それを区別する必要がホントにあるのか?
たとえば夏目漱石という著者がいたとして、
夏目漱石の著作としてみとめられてる本があったとする
その本の著作者は「夏目漱石」として認識してるのだから
その本を実際に書いたのが、猫の人だろうが>343の人だろうがゴーストライターだろうが、
その本の著作者は「夏目漱石」で何の問題があるんだ?
暑苦しいよ。 結局仕様次第でしょ。
>>357 著者名を真の著者ごとに区別するって話に誤解してないか?
同じ名前の別人を区別するかしないかって話だと思ってたけど
>>359 それはそれで余計ややこしくなりそうな…
前者だと思ってたってこと? 後者は区別しないほうがややこしいと思うが
中学の図書館での運用だから管理するのは大人だとしても運用するのは中学生だろ 複雑にしすぎても最後はグダグダになるからある程度シンプルにした方がトラブルの 原因が少なくなると思うんだけどね
つまりどの方法がいいと?
>>362 >中学の図書館での運用だから管理するのは大人だとしても運用するのは中学生だろ
いやだから仕様を勝手読みしても仕方がないかと。
そんなことは
>>332 には全く書いていないしそれ抜きにどっちが
良いも悪いもないというか
>>332 はどこいったんだこんちくしょう。
与えられた仕様の断片を用いて議論するのが楽しいんじゃないか
>>359 後者の同じ名前の別人、てのは、同じ著作者名で別人がいるってことだろう
前者も後者も同じことで、区別する必要がないんじゃないか、と思うが
断片での議論は楽しいが結論は出せんのがなぁw
区別する必要がないってなんで?
区別出来るように作ったスキーマを使って運用としては区別しない のは簡単だけど、一度区別しないことを前提としてスキーマ作って あとから区別出来るようにして下さいと言われると面倒くさい。 なので区別することを前提に作る方が後々都合が良いと思う。 どうせ大した手間じゃないでしょう。
つっても夏目漱石Aと夏目漱石Bを区別するためには 「夏目漱石Aが書いた本一覧」と「夏目漱石Bが書いた本一覧」をデータとして持つ必要があって。 全書籍・全著者についてそういったデータを持つかっつーと絶対やらないだろ。 感想文にはISBNを必ず記入すること、とかの方が現実的か。
>>369 >「夏目漱石Aが書いた本一覧」と「夏目漱石Bが書いた本一覧」をデータとして持つ必要があって。
やるのが当然だろ
>>371 全書籍・全著者って、感想文が提出されたものに限った話じゃないよ。
(提出された分だけ持ってても登録時に識別の役に立たない)
ISBNが現実的だな。 ISBNで管理して、著者名とタイトルは、ISBNから紐付けるべき。
>>374 感想文が提出されたものだけでいいじゃん
>>376 提出の度に毎回調べて登録するんですね。分かります
提出の度にデータ作成作業する気なのか?
だからそこまで手間をかけて識別しないと困るほど 同姓同名の著作者が同一著作者じゃまずいのか? そもそも同姓同名の別人な著作物なんてそんなにあるのかね
著作者はIDで管理すりゃいいべ IDから名前がひけるけど同じ名前の人だっている。 普通にやればこうなる
同姓同名だと同じと見なす訳だな。
amazonで「坂本 千尋」の本を探すと明らかに2人いるのがわかる。 最初は「こんな本も出してるのか、この人」とか思ってしまったぜ
メルビル守衛乙
>>383 学生の名前を主キーにしていいと主張してるひとって誰だ?
学生は同姓同名でも区別する必要があるってのは共通認識だと思ってたんだが
図書館なんだから図書館DBの著者マスタを使えばいいんじゃね?
そういうのが存在していて、かつ連携できるとなれば全く話が変わってくるな
図書館で使うのはおkだか、授業や研究で使うなら別ライセンスだろう。
図書館のサービスだろjk
おまえら、質問してる(=作る)人間のスキル考えろよw この程度でテーブルレイアウト丸投げするるような初心者がつくるんだから、 なるべく単純な要件ですました方がいいだろう、と だから著作者の同姓同名なんて無視しといたら良いんじゃないかと言ってるんだ
そんなことしたら余計仕様と機能と運用が混乱するだろ
結局は使いにくいって、全部やり直しに成るのがヲチ。 おまいらが毎度デスマってるいつものパターンじゃないか。
もうExcelでいいよ
395 :
名無し募集中。。。 :2009/03/27(金) 00:25:42 ID:ZRXm0Q5j
ExcelでいいならせめてAccessだろ Excelの方が逆に接続とかめんどいわ
Excelのテーブルってことだろw
だとしたらもはやDB設計すら語って無いじゃないか
Webベースのアンケートシステムを考えています。 基本的にはラジオボタンでの3択なのですが、未選択も可な質問があります。 未選択の時、列に格納すべきはNULLでしょうか、0でしょうか。 (「どれにも当てはまらない」ボタン設置は無しとして) テーブル構成は 学籍番号 int, 質問1 int, 質問2 int, 質問3 int... という風に各質問ごとに列を分ける方よりも、やはり 学籍番号 int, 質問CD int, 回答CD int とした方がよいのでしょうか。 30問程度あるので出来れば後者にしたいのですが、その場合、 「その他」選択時にテキストボックスへ任意の文字列入力を許可するのですが、 この文字列はどこへ格納すればよいでしょうか。NULL可な備考列を追加して、そこへ?
>>399 > 未選択の時、列に格納すべきはNULLでしょうか、0でしょうか
どちらでも。自分が後で集計するときに使いやすい方を選べばいい。
(IS NULL を使わなくて済むから)自分なら 0 を使う。
> テーブル構成は
後者で良い。楽できる方を選ぶ。
> NULL可な備考列を追加して、そこへ?
それが妥当
(どっちでも良いが自分ならNULL可じゃなくて既定値を空文字にするけど)。
単純なシステムの場合は、
入力時と出力時にどんな SQL を書かなきゃいけないかだけを考えて作れば良いよ。
少々間違えたって、すぐ直せるし。
俺だったら未選択はレコード挿入しないな 回答はtextにして数字と文字列を区別せず扱えば?
>>399 アンケートの相手が事前に分かってるかとかにもよるんだが、俺なら
アンケートそのものに未回答のもの=NULL
アンケートに回答して、その設問に答えてないもの=0
かな
テーブル構成は、未来永劫絶対に質問内容が変わらないなら前者も有り
でも普通はそうじゃないだろうから後者が無難
その他の回答欄についても、NULL可能な項目(備考じゃなくて、その他回答とかのほうがいいが)作って
その他を選んで回答してない=空文字列
その他を選んでいない=NULL
にする
ただし、DBによっては空文字列とNULLを区別できなかったりするし、
NULLの扱いは結構はまりやすいので、なるべくNULLを使わないようにする、って考え方もありだと思う
>>401 未選択はレコード作らない、って考え方はありだとおもうが、
単一項目に複数の意味合いのデータを入れるのはDB設計としては間違ってるとおもうぞ
同じ意味合いじゃん
>回答はtextにして数字と文字列を区別せず扱えば? の話だろ。 未選択時レコード作らないのは参照時に面倒だと思うよ。 もし取得できなければ○○、取得できた場合1なら□□、とか。
同意。 NULLは積極的に使うものではない。
>DBによっては Oracleの批判はやめてください
408 :
403 :2009/04/01(水) 13:58:23 ID:???
>>404 すまん、何と何が同じ意味だと?
>>405 俺も面倒だと思うんで項目にNULLでレコード作る方がいいと思うんだが、
項目にNULL入れると、その項目使う時にNULL判定しないといけない場合があるから
結局面倒さは変わらないかもしれない
レコードなくても、マスタとつき合わせたりするなら、外部結合するって手もあるからな
>>407 別に批判しているつもりはない。あえてDBを名指ししていないし
ただ、OracleがNULLと空文字列の区別がつけれないのは事実で、
そうなるとその区別を必要としないよう設計する必要があるのも事実だ
それが良いとか悪いとか言ってないぞ
まあ、個人的には俺のOracleに対する、ほとんど唯一にして最大の不満点だがなw
2chにおいての、”〜の批判はやめてください”ってのは 特定しましたと同じ意味しかないだろうに。
>>408 >すまん、何と何が同じ意味だと?
一番最後の行
>俺も面倒だと思うんで項目にNULLでレコード作る方がいいと思うんだが
何が面倒なの?
未選択時に○○,とか場合わけする必要性が分からない
合計数や平均を取る際にそのまま集計すればいいのでは?
411 :
403 :2009/04/01(水) 16:17:54 ID:???
>>410 >単一項目に複数の意味合いの
ってところか
たしかに広い意味では回答という同じ意味なんだが
たとえば、”はい”、”いいえ”、””(無回答)とかならいいんだが
数字とその他の文字による回答になると、数字はコード化された回答、文字はコード化されてない回答、となる
単純に数字と文字を同一項目に入れるなってのもあるし、意味合いって言葉がまずかったか
レコードありなしで面倒なのは、このDBを使うアプリケーションを作る時に、
アプリ側の作りこみが面倒になるかもしれないな、ってこと
たとえばこの結果を表示するアプリを作るとして、未選択時は特別な表示を要求されるかもしれないだろ
SQLのみの世界で見ればあんまり大差はないとおもう
Oracle以外からRDBに入った人にとっては、Oracleのあの文字列の扱いには殺意が沸くわな。
まぁでもあれでいいんじゃね MySQLやSQL ServerはDB側になんでも任せられるから それによってクソ重い設計とかできちゃうけど OracleやPostgreSQLはそういうのやりづらい感じになってる
>>413 DBに任せることができて、任せると設計が重くなる例ってのが想像つかん
たとえばどういうことをDBに任せるとどう重くなるのだ?
「Oracleなら仕方ないか、アプリで実装するか」的な ノリは漏れは嫌いなんだけどな。 あと、よくもわるくもOracleとPostgresを一緒にスナ(w 「普通に設計」させれ。
>>414 クライアントよりサーバーに負担がかかるってことだろ
>>416 なるほど。つまり、DBで処理するかアプリで処理するか、って問題か
DB設計段階で、元来DBですべき処理をアプリでするってのは本末転倒な気はする
性能設計って話もあるんだが、負荷軽減は運用に入ってチューニングと合わせて検討すべき内容だと思うなぁ
文字列加工とかの話だろ Oracleとかそういうのショボいからアプリ側でやらんと駄目だしね
なんでそんなものをDBでやらなきゃいかんのだ。
DBあるのにデータ加工をなんでアプリでやらなきゃならんのだ?
データ絞り込みならともかく加工でその文句は・・・w
加工までDBなのかよ。 どんだけ言語使えないのwww
ret = SELECT pref, city FROM address って取り出して プログラム側で str = ret.pref + ret.city; ってやんのか ret = SELECT (pref || city) as addr FROM address str = ret.addr; かって話だよな 後者はかなりもっさり祭りになるぞ アクセス少ないならともかく
加工じゃねぇだろ、それw
まあ場合によるんじゃないの? 最近は負荷分散の意味で サーバーサイドのcgiよりも クライアントサイトのjavascriptを使うって動きが出てるけど ソースは忘れた
ニコ動の開発者インタビューみたいなので、そんな話見たな。 まあ確かにAJAX系ではselect結果をxmlにしたら、 あとはクライアント側でどうぞという感じではある。
時と場合によるがOracleの場合は文字列加工にケチつけてるヤツは少ないのでは? 判定(where〜)がイカれているから、設計が歪んでいくって事だろ。 同じフォーマットでデータをinsertしても、selectするとOracleだけが判定結果がおかしいからな。
そんなんchar型だとどのDBでもあることだしなぁ。 そもそも必須だと言ってるのに空文字入れられちゃうのもどうかと。
単にオラクル想定の設計をしてなかったってだけじゃないの? スキル低いだけの様な。
たしかに「オラクルに対応するスキル」が低いといえるな オラクルはRDBMSの世界ではかなりスタンダードかもしれないが 問題は、オラクルにだけ特別必要なスキルがあるってことなんだと気付けよ
オラクルには対応できませんって断る勇気も必要。
オラクルのゴールドとかプラチナとかの資格は うんこ取扱師乙種とか甲種って名前に変更するべきだと思うんよ
お前は小学生か
だってあれもうDBの勉強じゃなくてうんこを安全に扱うための勉強じゃん・・・
昔はOracle最高だったんだけど レガシーな仕様を引きずりすぎて今に至ってる部分があるから あれはあれで仕方ないんだよ COBOLみたいなもんだ
レガシーを引き継いでいる分にはDB2はOracleに負けてない気がするが、 DB2は伝統的な記述しか許さない思想の性か、ちゃんとselectできるわけだが。 Oracleは資格士が必須な感があるにはあるな。 最新のバージョンは多少世間(?)に歩み寄っている感があるが昔のバージョンの 結合の構文から見てキモいんだが。普通にLEFT OUTER JOINとか書かせろと。
9iから使えるだろ>LEFT OUTER JOIN
FULL OUTER JOINにバグがあって怖くて使わなかったな<9i
スレ違いネタで無知をさらす
オラクル雑談スレが落ちてるからな。
こっちで代用すんなw
漏れのとこはOracle8が動いていますが、なにも。w
8iじゃないのか。乙。
8iってなにw
Linuxでまともに動くようになったOracleの最初のバージョン Javaと融合してインターネットサイトで使いやすくなった
具体的なバージョンは忘れたが、8のどっかのバージョン以降だな とにかく8の初期のころと分けて8iと呼ばれた iはインターネットのiだったらしい
8.1.5以降がi それまでWindows版しかGUIインストーラなかった
むしろCUIインスコがデフォ。
Accessを使ったWebベースのスケジュール管理システムを作ろうとしていて、100人程度の同時使用を考えています。 必要なテーブルは以下のとおりです。 1.マスタ関係のテーブル(複数) 2.スケジュールを入れるテーブルとその付属テーブル(複数) 3.アクセスログのテーブル 特にアクセスログはすぐに大きくなりそうなので別のファイルに保存しようと考えているのですが、 1,2,3のテーブルを1つのmdbファイルにするのと、 別のmdbファイルにしてリンクで結ぶのとでは処理速度が大きく違うものでしょうか? また、同時openの負荷を考えるとユーザーごとにmdbファイルを用意して その中にメインのテーブルに対するリンクを置くような形にすべきでしょうか?
accessスレで聞いたら? って、この板には無くてビジネスsoft板の方なんだな。
Accessだと大勢で使うのは厳しいけど、MySQLを使えば数百人規模でも問題ない?
数百人どころか超大手サイトでも問題ない
Access は。複数人(スレッド)で使うとすぐ壊れるよ。 せめて、SQL Server Express Edition にすべき。最大4Gの制限に 引っかからなければ、だけど。
ってかアクセスログはテキスト出力でいいと思うけど DBに突っ込んでくとそれがネックになって主要機能部分の性能落ちるぞ
Accessの上限は2G
ウェブベースでアクセスの選択の時点で駄目だけどな。 監視系のシステムとかだと、ネックに成ろうが、ログをDBに突っ込むけどな。 そうしないと膨大なログを処理しきれない。毎回テキストから抜くのも大変だし。
457 :
449 :2009/04/10(金) 23:02:49 ID:???
MySQLなるものをはじめて知り、無料なようなのでこちらを勉強することにしました。 コマンドプロンプトっぽいところが慣れないです。 ダブルクリックですぐ中身表示みたいなのがあれば便利なのですが。 まあ使い方がわかれば余計な心配しなくてよさそうなのでひと安心です。
MySQL Admin入れれ
あとODBCでAccessと連携も出来る
phpmyadmin入れれ
464 :
NAME IS NULL :2009/04/28(火) 03:22:34 ID:aHnBfSXl
株価データをDBに入れて保持してるんですが、今は1つの大きなテーブルに入れてます。 (取引日付 DATE, 銘柄コード int, 取引市場 int, 始値 double, 終値 double, 高値 double, 安値 double, 出来高 double) これ1個のテーブルで3000万件くらいになってます。このテーブルを使う処理が時間がかかるので、テーブルをわけてしまおうかと思っているのですが、 銘柄ごとにテーブルを分けるとテーブルが5000個とかになるし、 日にちごとにテーブルを分けると10000個近くになります。 銘柄ごとのテーブルと日にちごとのテーブルの両方を準備するとデータの冗長性ひどすぎという感じがします。 アプリからは、銘柄/日付/銘柄と日付の両方、を指定してデータ取得というのをよくやるのですが、 こういう場合どういう形でDBに入れておくのがよいでしょうか?
3000万件か。 趣味のレベルを超えてるな。 時間ってどれくらいかかるの? インデックスは適切に張ってるの? 分けるなら年度毎とかかな。
3000万でもインデックスあればそんな困らないけど すでにアクセスすることがめったにない昔のデータなら分けるかもなあ
どんなクエリを投げているのかな。 単に特定の日付の株価を検索しているのか、期間別の 平均値など集計を多用しているのか。
1件→3000万件で 検索時間は7倍程度って認識でおk?
土日祝日はザラバ立たないから年240日として5000銘柄の25年分くらいか システムトレードなら出来高上位1000銘柄の直近5年分程度に絞ってもよさげのような気もするけど…
338 北川 憲治. 1:28:58. 17. 321 蟹谷 保. 1:28:58. 18. 311 井上 正志. 1:28:59. 19. 351 加藤 弘恒. 1:29:18. 20. 335 高田 英司 .... 627 北川 憲治. 1:28:43. 12. 706 田賀 純介. 1:31:29. 13. 740 日高 寿美. 1:31:35. 14. 701 和田 安男. 1:32:03
移動平均線とかの計算でデータ引っ張ってくると、年度別に分けると面倒かもな。 漏れは、銘柄でテーブル分けかなあ。 為替のほうも取り込みたいから結構大変。 証券会社や取引業者に依存しない自分用のシステム作るのって結構大変だよな。
473 :
NAME IS NULL :2009/05/25(月) 01:35:09 ID:rfk82z3I
教えてください。 チェックボックスが30個くらいあって、それぞれのON/OFF状態をDBに 保存しなければならないとき、 1)チェックボックスの数だけカラムを作る 2)可変長文字列のカラムを1個作り、チェックボックスの状態をカンマ区切りかなんかで放り込む のどっちが正解でしょうか? 仕様変更などでチェックボックスの位置が入れ替わったり、数が変わったりする 可能性もあります。 SQL Server2005です。よろしくお願いします。
一対多の関係テーブルを作る
2やったら死ねるぞ
一人で使って、永遠に自分でメンテするテーブルでない限り2は禁止な。 約束だ。 あとチェックボックスの数はともかく位置はDB設計とは無関係じゃないの。 dbから動的にチェックボックス作成するってこと?
477 :
473 :2009/05/25(月) 03:00:14 ID:rfk82z3I
2)がまずい原因って何でしょう?
チェックリストボックスを読み込んだ順に1か0のカンマ区切りでDBに格納して、
チェックリストボックスを復元するときもDBを1カラム読むだけで楽かなぁと思ったのですが。。
>>476 上述の通り、読み込んだ順に処理してるので、位置が変わると過去データに矛盾が出るなと・・・
SQL Server上で配列定義ができればいいのですが。
・チェックボックスは何を選択するために使うのか。 ・チェックボックスの位置が変わる可能性はあるようだけど 数に関してはどうか。「30個くらい」で不変か。 ・チェックボックスの状態をDBに格納したとして、その情報を どのように利用するのか。単にチェックボックスの状態を 復帰するのに使うだけなのか、「チェックボックス1がonの xxxを列挙」みたいな感じで検索にも使うのか。 このあたりが分からないとにんともかんとも。
ただのストレージとして使いたいだけなら別に(2)でもいいんじゃね?
江戸時代のBIT型じゃねーんだからわざわざ2にする必要もないだろ なんのための"R"DBMSなんだよと
FILLER X(30)をREDEFINESでOCCURS 30とか なんだこのコボラー・・・
月次データの日付毎の有無とかだろ
>>478 たとえば病院の診療科(内科、小児科、外科)みたいのがズラズラと並んだ
チェックボックスで、過去受診履歴がある科のチェックがONになります。
この過去受診診療科情報は特に重要では無く、参考情報程度の扱いです。
将来的には診療科の増減があったり、科が細分化(内科が内科1、内科2のように)したりする
可能性があります。
単純にテーブルが増えたり、カラムを作ったりするのが非常にめんどうなだけなんですが、
後々仕様変更があった場合、労力がかからないのは1)、2)どちらなのかと。。
診療科の全一覧は別テーブルに持っているため、受診科履歴は
当初チェックがONの科をカンマ区切りで1カラムに放り込んでおけばいいやと思っていました。
情報の後出し、申し訳ないです
バカだから理解できないんだろ
>>483 それくらいだったら2でいいんじゃない?
わざわざテーブル作る必要ねぇよ
>>483 その仕様ならば尚更1)以外に選択肢が見当たらないけど・・・
2)はケースをよく考えてみろ、データ崩れる可能性がある。
>>477 >2)がまずい原因って何でしょう
「チェックされた項目の名称をマスタから引っ張ってくるとか」
「○○科受信歴がある患者一覧」とか
「○○科受信歴があり△△科受信歴が無い患者の人数」とかいった、
DB的使い方に全く適さない格納方法だから。
>>483 みたいな使い方であれば2でも大して問題ないんじゃないの。
>>483 いいんじゃね?2)で。
CLOBにしてXMLでデータ突っ込むようにしたら、もう一生このスレの世話になる必要はないぞ。
一意番号(1,2,3...)のテーブルに対して、 一意番号+科目マスタID(内科1,内科2,外科1,外科2...)みたいな明細テーブル持って、 1-内科1 1-内科2 2-内科1 2-外科1 みたいなレコードの持ち方すればいいんじゃね? 科目マスタをメンテナンスすれば動的にデータ追加できるぞ。
別に2でも良いだろ。 作り直したら、2で格納したデータを更新すれば良い。 心療科の増減でごちゃ混ぜになるほうが医療事故で怖い気がするけどな。 小児科2消滅→内科2統合→小児科3新設→内科3統合→小児科2統合 とか増減有って、履歴追えるような仕様なら結構大変だ。
>>477 単にチェックの状態を押さえておきたいだけなら2でもいいと思うけど、情報が足りない。そのチェックの並び情報ももう1カラム追加して管理したらどう?
create table checks(
ID number(10)
,checkItems number(1) -- number of checks (max 9)
,checklabels varchar(100) -- example: 内科1,内科2,外科1,外科2,小児科
,checks varchar(9) -- '0':off '1':on
)
checklabelでチェックの順番を保存しておく。'内科1,内科2,外科1,外科2,小児科'みたいに。別に文字列でなくて診療科のコードでも構わない。
checksが '01010' だったら内科2と外科2がチェックされた、てな感じ。checks['内科1']='0'、checks['内科2']='1'、....の連想配列イメージ。
表示順なんかはアプリで制御せざるをえない。
でも後々を考えるなら
>>474 の方法を検討した方が良いと思う。
「診療科毎の患者数を知りたい」なんてのは普通に出てきそうな要件だと思うが。 素直に別テーブル ・患者ID ・受診科ID ・最終受信日 みたいなの作って管理すればいいんちゃう? まぁ他の人が言ってるように、単なる一時保存なら2、後々統計情報に使いたいなら1かと・・ 表示順を気にするなら診療科IDのつけ方のほうが重要だったりするけどね。。 増減があることを見越して、十分な隙間をとって採番してかないとアプリの工数が増える。
変更の可能性がある表示順をそのデータに依存させるなんて怖いことはせず、 表示対象と表示順を持ったテーブルを準備して、目的のテーブルとJOINして使う。 order by 句で表示順をソートすればいいんだから。
用途がなんであろうと2はないだろ。
2を推してる奴は
>>477 が自分の客だと想定しても同じことが言えるのか?
確実に将来に渡ってチェックだけを記録するだけの為に使うって保証なんてないぞ。
前提としてこれを抑えてる奴がいるが、こちらの設計思想を理解してもらえると思ってるのが甘い。
コボル前提なら有りな模様
そうやって無駄に工数増やして苦しくなるだけの様な。 簡単な事を難しく遣ろうとして、請求を水増ししようとしても客の理解は得られないぞ。
2の方がよっぽど面倒だと思うが…
何事も経験だ。 迷っているなら一度やってみるのがいいさ。
遡ってスレ眺めれば、473 が技術的に
>>474 を思いつけないレベルであるのを理解して2でもいいんじゃないかと言ってるのがわかると思うよ。
客もその情報をあまり重要視していないようだし、理解できない方法で下手打つよりは、ダサダサでも自身で理解できる方法で実装した方が安全、ってなところ。
客が納得いかないとか設計がどうとか言うなら、 473 に理解できるようお勧めの方法を説明してあげて。
その方が他の人もそれをネタに色々議論できるだろうし。
DB設計を語るスレにわざわざ相談しに来てるんだから 自分でもうすうす2の実装に疑問があるわけだろ だったら正規化で解決する方法を学ぼうとする姿勢くらい見せてくれても
すいません、ここでいいのか判らないのですが教えてください。 MySQLに姓名、メールアドレスや誕生日などの個人情報を保存して 住所録を作りたいのですが、友人から個人情報保護法とやらで WEB上に個人情報を保存するのは禁止されてるって聞きました。 だとしたら、ネット通販とかで一度購入していたら個人情報が引っ張り出されますが あれはどうやって作っているのでしょうか? または、ある基準さえ満たせば保存してもいいのでしょうか?
>>502 お前程度の知識でそんな事やったら絶対に漏洩する。
悪いことは言わないからやめとけ。
>>503 すれ違いでしたか・・すみません。
なのに答えていただいてありがとうございます!
>>504 やっぱりそうでしょうか・・・orz
業者に頼むと高いのでお前がやれと言われたんですが、
ちょっと上司に掛け合ってみます。
有難う御座います。
すれ違いな質問をして、皆さんすみませんでした。
DBに直接アクセスするようなのはNGだろうな。 AP鯖経由ならいいんじゃねえの。 まあネット上で個人情報漏らしてるのはたまに見るけどな。
log.csvとかform.csvとかtoiawase.csvとかで検索するなよ 絶対だぞ
高いからしっかり漏れないように仕事してくれるのにな。 馬鹿な上司の居る担当が作ったサイトは使いたくないねwww
コボルのデータをそのままSQLにつっこんだような DBはまずどこから直すべきでしょうかw もうどうしていいかw 鬱に成りそう
とりあえずゼロベースで、1から作るとしたらどんなDB設計するか、から考えてみたら? 既存のものありきで考えると思考が硬直化するよ。
>>509 まず第一正規化します。次に第二正規化します。最後に第三正規化します。
あんまり正規化に、こだわる必要も無いけどな。 むしろ業務フローに合わせたほうが効率的。 どうせどんどん機能付け足しで正規化崩れてくるから。
究極まで正規化すると実用的では無いけど コボルベースの横長テーブルは正規化しないと実用的では無いよね
業務にも明るくないとほとんどメモ的うにしか使わないフィールドを 一所懸命正規化してテーブル分けたり、 逆にメモだろと思ってコード化も正規かもやらなかったフィールドが 重要なキーになったり。 もう少しDB設計に時間かけさせてくれよぉ。
どうせ崩れるからと最初から正規化をしないととんでもないものが出来上がるが 作った本人はどこがわるいのかわからない、さいてー
テーブルが全部charで記述されてます 1テーブルカラムが100列超えてます どうやって治せばいいの?
>>516 全テーブルがって訳じゃなかったが、テーブル名がtable1〜tableN、更にカラム名がcol1〜colNというDBを見た事がある。
業務とデータと現行アプリから地道にマッピングしていった。
現行アプリのソースが無かったら、作り直し以外受けれなかった。
>>516 今見てみたんだが4割ぐらいのテーブルで
IDとかいうcharのカラム1個に、最大までとったvcharカラム1つ
という構成になってた。w
もう俺逃げる
>>518 べつにそれで良ければ問題はないと思うのだが。
いいのかよw BLOBですらないんだぞw
IDとかいうcharのカラム1個に、最大までとったvcharカラム1つという構成。
これがなにに使われているかが問題。
>>518 は「なにに使われているか」の説明が欠けている。
たとえばID+テキスト文書だったら、これでかまわんだろ。
そんなことでは一々書き込まないだろう。 ここはもちろん、長さ100バイトに及ばんばかりのビットの羅列だな。 それぞれが別個のフラグになっている。
いちいちidは要らないだろ。ruby廚でも買ってるのか?
>>522 長さ50バイトぐらいのデータが4000個から32000個
詰め込んでるようです。とりあえず退職願出したけど
ダメって言われて危うく軟禁されそうになったけど
トイレから逃げてきた
どんだけブラックだよ
>>524 > 長さ50バイトぐらいのデータが4000個から32000個
なんのデータなんだろう。
社員マスターのデータ(社員番号、氏名、所属・・)などをCSV形式で格納したものなのだろうか?
なんらかの計測データなんだろうか?
前者なら言語道断だが、後者なら納得できるもの。
質問があります。 各アカウントの権限の状態(アカウントAには公開、削除を、 アカウントBには公開、閲覧を許可するなど)を 保存するテーブルの作成を考えています。 はじめはカラムを アカウント名 公開フラグ 削除フラグ 閲覧フラグ として、実際に格納するデータを A 1 1 0 B 1 0 1 というように各フラグには有効/無効を1か0で格納しようと考えていたのですが、 「将来新たに権限が増えた場合、カラムを追加しないで済むテーブル構成を考えて欲しい。 今のままでは権限が増えるたびにカラムが増えてしまう」 と要望がありました。 この要望を満たすテーブル構成はどんなものがありますでしょうか。
>>527 アカウントごとのアクセス制限を設定するにはGRANT文を使うんじゃね
GRANT文で設定された権限の状況はSYSTABLEPERMSなどのシステムテーブルを見ればわかるし
ユーザテーブルで管理する意味がわからない
勘違いしていたらごめん
>>527 SYSTABLEPERMSを参照するとか
>>528 >>529 説明不足ですみません。
ここでいうアカウントや権限は、DBに関係する権限ではなく、
例えば、ビジネス文書の編集、公開、削除といった動作を許可するかどうか
といったものの権限を指します。
アカウントマスタ、権限マスタ、アカウント権限テーブル
>>531 アカウントマスタのカラム
アカウント名
権限マスタのカラム
権限名
アカウント権限テーブルのカラム
アカウント名 許可したい権限名
として、
アカウントマスタ.アカウント名=アカウント権限テーブル.アカウント名
と
権限マスタ.権限名=アカウント権限テーブル.許可したい権限名
で3つのテーブルを結合する、という認識でいいのでしょうか。
許可したい権限だけをテーブル(アカウント権限)に突っ込むのか、 基本的にすべて突っ込むようにして、許可・拒否フラグを用意するのか、 その辺は仕様次第かな。 あと、名称を直接、ではなくて、ID でリレーションを保持するように、 ってのは、RDBMS の基本。
回答とアドバイスありがとうございました。 細かいところは自分でもう少し練ってみます。
>>533 どこの世界の基本だ?
あと「リレーション」って使い方間違えているような気がするな。
どっちの意味にしてもおかしいけど。
>>530 こういうのはいけないって事?
create table ユーザテーブル(
ユーザID varchar(4)
, 有効 char(1) -- 1 or 0
);
create table 権限テーブル(
ユーザID varchar(4)
, 権限ID varchar(3)
, 権限 char(1) -- 1 or 0
);
・ユーザID X001 さんの権限ID A01 を取得
SELECT A.ユーザID
,B.権限 as 権限A01
FROM ユーザテーブル A LEFT OUTER JOIN 権限テーブル B ON(A.ユーザID=B.ユーザID)
WHERE A.ユーザID='X001' AND A.有効='1' AND B.権限ID='A01' ;
・ユーザID X002 さんの権限ID A01、権限ID A02 を取得
SELECT A.ユーザID
B.権限 as 権限A01
,C.権限 as 権限A02
FROM ユーザテーブル A LEFT OUTER JOIN 権限テーブル B ON(A.ユーザID=B.ユーザID)
LEFT OUTER JOIN 権限テーブル C ON(A.ユーザID=C.ユーザID)
WHERE A.ユーザID='X002' AND A.有効='1' AND B.権限ID='A01' AND C.権限ID='A02' ;
全部の権限を1レコードに集約する必要が無いなら上記の権限テーブルの内容で充分だと思うけど。
せいぜい有効期間を設定するくらい。
使いもしない項目を全部横に並べないと気が済まないのはCOBOLの人によくありがち。
レコード全部読み込んで自前ジョインやってたのを見て怖ぇと思った。
>>536 COBOLERはほんと害悪。
「1レコード読むだけで全部の情報が手に入って便利だろ」
「テーブル増やしたらパフォーマンス上不利」
「ちなみにNULLはオール9に置換してある」
COBOLERというよりは、ISAMERが害悪という意見を聞いたことがある。 まあどちらも滅んで欲しいには違いない。
全部読み込みならRDBM要らないだろwww RDBM無しの太古のやり方のまま使い続けてるよな。 オンメモリDBとか提案すると渋々対応するけどな。
540 :
NAME IS NULL :2009/06/14(日) 22:51:52 ID:dUBFuZEU
>>533 「リレーションシップ」(エンティティ(テーブル)間の関連)
「リレーション」(関係=テーブル)
DB設計されるみなさま、なるべく用語は正しく使いましょう
540みたいなレスみるとまだまだコミュ力無しでいる奴らが多い事にびっくりする。 間違いは間違いだが、流れで把握してやりゃいいもんを・・・まぁ、それが出来ないからこんなレスするんだろうが
>関係=テーブル ・・・
そうか? 「ID で関係を保持する」なら、普通に意味は通じると思うけどな。
みんなと仲良く出来ない香具師が多いのか? 仕事で嫌な事でもあったのか?
>>544 「てにをは」がおかしいだろ。それを無理に解釈するならば、
「IDでテーブルを保持する」でも意味が通じると思い込むことが
可能だ。
関係 = テーブル、ってのがわからん。
例えば上の例で、「アカウント名」と「権限名」には本来なんの関連もない。 この2つの値の間になんらかの対応関係があることを表現したものがリレーションであり すなわちテーブルであるということ。
2行目までは理解できるけど、3行目がわからん。 「すなわち」って言われてもなぁ・・・ テーブルとテーブルの関係 = リレーションだとしたら、 テーブル != リレーション だろ。
テーブルとテーブルの関係じゃなくて値と値の関係。 ここで言っているのは(アカウント名,権限名)という テーブルのこと。 このように両方の値を含むテーブルがどこかに存在 しない限り、どうやってもその寛刑を表現することは できない。
正規化
自分に正しい知識がないのを棚に上げて 相手に「コミュ力無し」と言ってしまう奴は DB設計なんかに関わるな
>>550 関係データベースモデルにおける「関係」(relation)と、
その実装である表(table)は本来別物。
数学的にもそれぞれ異なる性質を持っている。
なので安直にテーブル=リレーションと括るのはどうも。
確かにそうだけど、リレーショナルモデルとERモデルの区別すら ついてなさそうな人にそこから説明してたらさらにわけわかになるような。
まあ職業がSEとかプログラマってやつでも リレーションシップの意味でリレーションって言ってるのは耳にするよ で、そういうヤツに限って、客に専門用語で喋って 理解されないのは客が無知だとか言い出す(笑)
556 :
名無し募集中。。。 :2009/06/15(月) 16:56:16 ID:xNy+RduF
リレーションってテーブル同士の関連以外の意味で使わないだろ
まぎらわしい用語が悪いんじゃない?
用語の良し悪しはともかく 「IP?IPアドレスのことだろ」とか 「携帯って持ち運ぶって意味なんだけど。携帯電話って言えよ」とか 得意げに言い出すヤツはなー。
>>558 メールとかでIPって言う分にはスルーするが、テーブルのカラム名にXxxIpとか使い始めたときは
さすがにつっこんだわ。
まーでもテーブルがリレーションってのは有り得ないのは間違いないな テーブルの関係性がリレーションだろ普通に テーブルがリレーションなら それの関係性はリレーションのリレーション ってことにならないと辻妻合わない
リレーショナルデータベースの理論においては、「テーブルの関係性」に相当する 概念がそもそも存在しないんだよ。 あるとすれば、E-RモデルのRelationshipか、実装での FOREIGN KEY とか。
ウチの上司は最初に触ったWebアプリがCGIと呼ばれてたので、 以後、JavaServletでもPHPでも何でもWebアプリ=CGIって呼んでるよ。
>>555 客に話す場合と「DB設計を語るスレ」とでは使い分けるよ
つまらん! おまえらの話はつまらん!
昔はもうちょっと面白い話出てたのに揚げ足の取り合いレベルのスレになったか。 こんなので盛り上がれてうらやましいよ
昔は今はとかじゃなくて 定期的におかしなのは出てきてた
関係(relation) R とは,属性 A1,…,An が与えられ,それぞれのドメインを D1,…,Dn とすれば, 直積 D1×D2×…×Dn の有限部分集合である. だから、関係(relation)はテーブルと考えていい。
テーブルとテーブルの「関係」は関係代数おける和,差,共通,直積などの集合演算と 射影,選択,結合,商などの関係モデルの基本操作をいう。
実務でDBいじってる奴が テーブル=リレーション とか言ってるのは今のところ見たこと無い。 リレーショナルモデルの学問では テーブル=リレーション なのかな。 だとすると、リレーショナルモデル視点とリレーショナルデータベース(の実装)視点では食い違いが出るはず。
誰か理論を語るスレ立てろよ
>>570 クエリーの結果もビューもリレーション。
あっち支店で
>>573 リレーショナルモデルの視点で。
リレーショナルモデルでは表形式のデータはリレーションだから。
>>570 実務だとそうだねぇ。それだけ現場にはキチンと理論を学んだ人がいないってことだな。
で、そういう人に限って「コボラーwwww」なんて言ってんだよな。
自分より下の存在があることを確認してないと生きていけないみたいに。
そんなもんだろ。 プログラミングとはちょっと勝手が違うしな。 DB専任技術者なんていないプロジェクトの方が当たり前だし(いてもインフラ系で物理設計しかやらんとか)。
なんでインフラが物理設計やるんだ?
>>575 リレーショナルデータベース視点だと、クエリーの結果もビューも演算結果。
>>576 DBを単なる順編成ファイル置き場としてしか見てないCOBOLな人が多いですよ。
理解してる人はちゃんとクエリ出すし、必要に応じてカーソル使う処理書いたりしてる。
でも圧倒的に前者が多い。他所だと違うのかもしれんけど。
DB専任なんてコストのかかる状況自体が好まれないからな。 出来るだけ少人数に抑えれば、それだけ儲けるし。中途半端でも兼任出来る香具師のほうが好まれてしまう罠。 DB専任は、周りに理解されてない香具師が多いのかもな。 ちゃんとSEやプログラマや上司や客とも仲良く成れよ。
まさかとは思うが物理設計をハード側だと思ってる奴いないか?
>>568 釣り?
ちゃんと丁寧に書いてある教科書ならリレーションとテーブルの
似て異なる点が書いてあると思うけど・・・
>>570 >リレーショナルモデルの学問では テーブル=リレーション なのかな。
普通区別します。リレーションは数学上の抽象概念で、テーブルは
その視覚的表現だったりSQLで扱うテーブルのような実装を指します。
実際のテーブルには行に順序があったり重複があったりしますので、
「ドメインの直積の有限部分集合」という一般的なリレーションの
定義とは異なる部分も出てきます。
その学問上のリレーションを実装するときに、 関係を格納するテーブルを使うからリレーション=テーブルとかいってるんじゃないのか?
連関エンティティのことですか?
なんでやねん。 リレーションは、属性間での関係のこと。
関係データベースの「関係」ってのはテーブル間の関係ではなくて、属性間の関係のこと 実装としてはテーブルがこれに該当する(差異はあるが)
>>585 エンティティとリレーションシップで考えるのはE-Rモデル。リレーショナルモデルと
イコールではない。
やっぱり混同している人は多いんだな。
MSのアクセスには「リレーションを設定する」とか「リレーションシップ」とかの機能があるんだよな。 アクセスのユーザーはリレーション=テーブル間の関係=JOINのキー設定というイメージが ついてしまう。
つまりアクセス廚とそれ以外の間での話か。
レッテル貼り乙。 テーブルをリレーションと表記しているDBMSをいくつか挙げてくれ
postgresとか。
Accessも「リレーションシップ」であって「リレーション」じゃないんだよな。
またAccessか!
というか、そのディレクトリ名やファイル名はもう少しなんとかならんかったのかと
597 :
NAME IS NULL :2009/06/23(火) 10:42:38 ID:tL+3Dp5k
基本的なことかもしれないですが、教えてください。 DBは PostgreSQL , Oracle ,MSSQL のいずれかを考えており、まだ決まっていないので 一般的に、ということで教えてください。 パフォーマンスを考慮すると、長い文字列を主キーとして使っていいものか、それとも1:1に 対応される数値型のコードを作成すべきか、悩んでいます。 本来であれば1:1に対応できるコードであれば無駄、と思うのですが、 Indexの性能を 発揮できるのは 数値型なのかとも思います。 製品コード(英数MAX30桁) データ量: MAX1000万件 リレーション貼られるテーブル数:約10個 皆さんであればどのような設計しますか?
どっちでも変わらんよ
ハッシュ化して比較するから、かわらんわな。
600 :
597 :2009/06/23(火) 17:26:51 ID:tL+3Dp5k
ぁ、そうなんですか。
ググってみたところ、 MySQL の InnoDB では長いPrimaryKeyを持つと遅くなる、
という記載があったので、 他のDBでも同じなのかな?と思っていました。
MySQL自体あまり知らないので何とも言えないのですが。
ソース:
http://dev.mysql.com/doc/refman/5.1/ja/innodb-tuning.html > InnoDB 内では、長い PRIMARY KEY を持つと、その値が全てのセカンダリ インデックス
> レコードを利用して格納される為、ディスク領域の無駄遣いになります。(詳しくは 項13.5.13.
> 「InnoDB テーブルとインデックス構造」 をご確認ください。)
> もし主キーが長かったら、AUTO_INCREMENT カラムを主キーとして作成してください。
ありがとうございました。気にせず 文字列を主キーとして使ってみます。
601 :
597 :2009/06/23(火) 18:03:13 ID:tL+3Dp5k
597です。 もう1つ教えてください。 PrimaryKeyが複合キーだった場合でも同じですか? 製品コード+リビジョン でユニークになる場合、とか。 この場合は他テーブルとのリレーションシップも複合キーになってしまうので、 製品コード+リビジョン と 1:1になるユニークなIDを付けたほうがいいのでしょうか。
>>601 変わらない変わらないといわれてもどうせ時間がたてば
「製品コードの桁数とかコード体系変更するから」とあっさり言われるのがオチなので
最初っから製品コードなんか主キーには使わないな俺は。
それはカネ取っていいレベル
604 :
597 :2009/06/23(火) 19:21:59 ID:tL+3Dp5k
>>602 それを踏まえて 主キーであっても varchar() にしておき、桁数もちょっと余裕をみておく、
というのと、 AutoNumber でDB内独自コードを主キーとして追加する、というのでは
主流は AutoNumberなんですかね。
varchar を主キーに使わない理由、ってあるんでしょうか。
それともいつ変わるかわからないものを主キーにはしたくない、という思想なのでしょうか。
varcharを主キーに使わない理由なんてないよ。 型に関係なく「なんちゃらコード」の類いはだいたい>602の理由で主キーにするのが避けるのがノウハウってだけ。 業務用件しだい(コード体系変更の場合でも古いコード体系も蓄積していく、とか)でコードをそのまま主キーにできる場合もあるし。
主キーはNULL不可かつ重複不可でしょ。 客先は一意だと言ってても、それが将来的に保証されることはない。(実際に食らわされたことあり) DB内独自コード(サロゲートキーといいます)をつければ、どんな理不尽なことがあっても主キーの条件は守られる。 varcharでもいいと思うよ。ただし、後に泣くことが1%もないとは言い切れない。ただそれだけ。
後出しで「製品コードは後からあらためて付番するから、無い場合もある」って要件が出てきたこともあったな… IDをプライマリにしていたからそれでも良かったんだけど、 「製品コードが無い分の納品書は製品コードで検索できない」って当たり前のことをいくら説明してもわかってくれなかったよ。
主キーはNULL不可かつ重複不可かつ不変であること
>>600 MySQLはハッシュキーをサポートしてないからね。
サロゲートキーあたりの議論は相当古くから存在していて宗教問題みたいなものなのだけど、検索してみると双方の主張を見つけらるから興味があれば調べてみるといいよ。
すみません嘘つきました。InnoDBはハッシュインデックスサポートしてたんだ。出直して来ます…
611 :
597 :2009/06/23(火) 21:42:17 ID:tL+3Dp5k
皆様、ご回答ありがとうございます。 ググってみても、やはりサロゲートキーをやっておけばあとあと何があっても対応できる、との 記事が目立ちました。 サロゲートキーを使うと、複数テーブルを見ないとわかんないので何か面倒くさいなぁ、と思っていたのですが この部分は過去に痛い思いをした人しか実感できない重みのようなものがふつふつと見えてきましたので 皆さんの忠告どおり、サロゲートキーで作ることにします。 ありがとうございました。
>>606 ここまで極端だとサロゲート「厨」と言っていいレベルだな。
どうせ後で変更されるから業務分析も要件定義も意味ないと
言っているようなもん。
そもそもセマンティクスが変わってるのに「主キーの条件」だけ
守ることにどんな意味があるの。
同意だな。 そこまで病的に主キーに拘る理由が解らん。 サロゲートを使うのは要件次第と思うが。 アフォな要求にムリに答える事はないと思うが。 顧客に対して「はい」しか言えないエンジニアは常に痛い思いしかしない。
まぁ、ちゃんと意味があるサロゲートキーももちろんあるんだろうけど、 2chに書かれてる実体験てのを見てると、検討が甘かったのをなんとか 辻褄合わせようとする一種のバッドノウハウにしか思えないもんね。
大して極端ではないと思うが。。。 「サロゲート」キーという名前が悪いかもな。 あくまで存在そのものに対する識別子は非常に有用なんだけども。
コンピュータだけでなく業務も含めて知識と権限があれば自然キーを主キーに出来るんだけどな。 多くの場合権限がなかったり、 業務系の深い知識が身に付くのがシステムが完成してからだったりする。 バットノウハウというより必要悪だろう。 権限も知識もないのにごり押しでキーを決めちゃって業務手順まで変えさせた挙句、 動かないシステムを作っちゃった人もいたなぁ。
>>616 キチンと意識して、本来のサロゲートキーとして使う分には問題ないんだけどね。
それを主キーの将来の変更が容易になるなどと考えて安易に使うのがおかしいだけで。
特に対応する自然キーが存在せず内部的な人工キーでしかレコードを特定できない
テーブルなどは、余計に注意しないとそれが何を表しているかわからないカオス
状態になりかねないからねぇ。
ID=1のレコードと2のレコードのどちらを選択すべきか、IDしか手掛かりがなければ
お手上げでしょ?
>>618 主キーをどうするかという全く実装上の話にすぎないで、自然キーを無くすわけじゃないよ。
1か2のどちらを選択すべきかってそりゃ指定された方を選択するんだろう。何言ってんだお前
そもそも製品コードというのはユーザのビジネスの都合で決定されるものであって システムの都合で決定されるものではない。 それをシステムの主キーにしていたからコード体系を変更することができませんとか、 改修費用がかかりますとかは論外だろjk ユーザをサポートするのがシステムの役割であって足をひぱってどうする。
そもそも論をぶつ人の言うことは聞かないようにしている。
>>621 業務のためにシステムを作ってんだったら、業務ルールが変更されたらシステム改修が
必要になるのは当たり前だと思うけどね。
改修が必要になっても費用を払ってくれないような困った顧客と付き合っているのなら
ともかく。
ビジネスにもシステムにも明るくにらみの効くお偉いさんがいるならいいのだけれど、 まずいないからねぇ。 外注SEに出来ることは限られる。
なんかすげーCOBOLちっくなのがいるなw
確かに。 「後で必要になるかもしれないから」と言って予備のカラムをたくさん 作っちゃうんだろうな。こういう人達は。
>>621 事前に「変わらない」という合意を得ていたのに
後から「やっぱ変えます」じゃあ費用がかかりますと言われて当然
変えちゃいけないんじゃなくて
変える可能性があるものを「変わりません」なんて言うなって話。
>>627 お客さんが「変わらない」と言うからなんてのはアレだな。
結局、顧客と上手くコミュニケがとれてない人の予防策がサロゲート信仰って気がするな。 普通にビジネスしろよ。
>>628 ちゃんとドキュメント書けよ、議事録残せよ。
何度か痛い目見れば、誰のためでもなく自分のためだとわかるはず。
>>630 話が食い違うな。
ドキュメントも書くし、議事録も残すし、顧客とコミュニケーションもとるよ。
その上で顧客の言う「製品コードは不変です」の上を行くようにしないとな。
議事録突きつけて「変わらないって言ったよね」って金を取るのもいいけどさ。
「上」ねぇw
主キーを自然キーにするメリットって何だろうか
客と合意を得た事項を「ひょっとしたら客が間違ってるかもしれないからどっちに転んでもいい実装にしておく」なんてのは馬鹿だろ。 「ひょっとしたら客が間違ってるかもしれない」をクリアにするのがあるべき姿。 疑い出せばテーブルの主キーだけですむ話ではない。 例えば製品コードは一意です、という前提が無いと 製品コードを入力し決定ボタンを押したらその製品の画面に飛ぶ、ということすら出来ない。 不変であるという前提が無ければ画面で製品コードを変更できるようにしておかなければならない。 画面も全部何パターンも用意するか? ちゃんと「ひょっとしたら客が間違ってるかもしれない」をクリアしとけよ。
なんかSIerって感じだな
ごめん話にならないや。
その部分の話を顧客にちゃんとすると、 合意の上で結局サロゲートキーを持つことになるんだけどな。 言質取った議事録書いたやったーなんて態度のエンジニアは少なからずいるけど、 やっぱり煙たがられているよ。本人は賢く立ち回ってるつもりらしいけど。
合意の上で製品コードはキーになりません、画面はこうなります、工数はこれだけ増えますなら何の問題も無い。 勝手にいろんなケースをたくさん想像して「ああなってもこうなっても対応しとこう」みたいなヤツは出来ないヤツだよ。 本人は賢く立ち回ってるつもりらしいけど。
>やっぱり煙たがられているよ。本人は賢く立ち回ってるつもりらしいけど。
実際には
>>637 なサロゲート厨が「現場からは煙たがられてる」に1票。
それは変更の可能性をあらかじめ織り込んだ設計って事で なんも問題ないじゃん。 きちんとそういう検討をした上での結果ならいいんだよ。 ただ、全部のテーブルでそんな手間かける気にはならんだろ?
勝手に宇宙に存在するあらゆる可能性を考慮したテーブル設計しといてくれ
サロゲート信者の言っている事って、なんか変なんだよな。 コードが一意でなくなる可能性のある部分の設計は「話し合いの結果サロゲート」ではなく 「最初からサロゲート」で問題ないはずなのに、「ここでサロゲート使う俺SUGEEE」て自慢が あるのはなんとも厨房臭い。 粗悪な設計をして工数とりたいだけと違うのか?と小一時間(ry
単に業務を知ろうとしないエンジニアの戯れ言としか思えない。 業務知らないのに、業務に最適化された設計なんて無理なんじゃwww 客先に伺ってもうちょっとヒアリング詰めてまともな要件策定しろよ。 ヲレの設計はすばらしいから、ユーザは従えだろう。 ユーザは、実際に業務で使ってみて、このシステム使えないなと評価して、作ってるエンジニアは信用を失っていく。 製品コードって顧客でどの程度不変なのかヒアリングすれば(ry 簿記とか業務知識有れば、納品書には連番振って会計上の抜けが出ないようにするべきとか思いつくのにな。製品コードでしか検索出来ない仕様の時点で糞システム認定。 現場の他にも、経理とかからも納品書についていろいろ突っ込まれてそうwww いざ納品してみて、業務に合ってないからシステム使えないのに、更に改修費用を請求するのも詐欺だろう。 最初の設計が甘いのが原因だし、その甘い設計で業務まで変更してユーザに迷惑かけてたら目も当てられない。最初の開発費には、業務のヒアリングや設計も含まれてるでしょ。
>>642 >「ここでサロゲート使う俺SUGEEE」て自慢があるのはなんとも厨房臭い。
パラノイア気味だね。だれもそんなこと言ってないよ
小一時間とか○○厨房とか2ch語の使い方、以前も見た気がする。
もちろん候補キーは制約を含めてしっかり洗い出す。
その上で人工キーを主キーにすることでシンプルな実装になる。
無駄な予備フィールドもつようなバカ設計とは次元が違う話をしてるんだが。
で、自然キーのメリットって何よ?
無駄な予備フィールドは要らないが、ちゃんとヒアリングしてちゃんと拡張出来る様な設計をしておくのが大事。
>>643 業務を知ろうとしてないという以前にヒアリング段階でアサインされるレベルに立ってない人か作り投げなんだろう。
まぁ、うまく中間取れない性質っぽいから客先出したり、企画なんか無理だろうけどね。
しかし、ほんとお前らサロゲートネタ好きだよなw
サロゲート厨はいい餌まいているんだろ。 正直、サロゲートを使うべきってヤツは大抵レベル低くてツマンネ
いや正直、嫌サロゲート厨もうざい。
本人光臨か。 自作自演が痛々しい。
>>644 分析も何もしないまま、サロゲートキーにしておけば後々の変更に強いから良い、
という
>>606 みたいなバカ設計の話をしているんだが?
大佐、指向性サロゲート粒子を
ID表示したら面白そうな流れだねえ 朝っぱらからご苦労さん
>>643 >製品コードでしか検索出来ない仕様
反論できなくてよっぽど悔しかったんだろうが
人の発言を勝手に「反論しやすい形」に歪めるのは感心しないな。
客からも「人の話ちゃんと聞いてます?都合のいいように曲解するのはやめてください」ってよく言われるだろ。
>人の発言を勝手に「反論しやすい形」に歪めるのは感心しないな。 ここにいる連中全員だろ(笑 全体的にかみ合ってないし。
そういう「○○君もやりましたー」とか言う小学生みたいな逃げ方もあるのか
なに!?この盛り上がり方 ははーん、このスレを盛り上げたいときはサロゲートキーの話題を書き込めばいいんだ
猫にかつぶし マルチスレッドスレにvolatile DBスレにサロゲート そろそろ満足したかい?
盛り上がっているのはサロゲート厨が自作自演とか頑張っているからじゃね?
嫌サロゲートは設計したことないんだろうな。 頭でっかちになるのもいいが、世の中は理屈だけじゃ通らないこともあるんだぜ? 客の言質が取れて金が貰えればいいってのはガキの主張だ。
反論できなくなると人格攻撃、って芸のない。
>>659 その理屈をどう通すかってのも仕事として大事だわな。
だいたい、客の言うことが信用できないというときに
それを正面から質すことができないで小手先の対応を
するような奴がそんなセリフ吐くのはおこがましいと
いうかなんというか。
ふつう、客はDBのテーブル構造なんかには興味はないだろ。
どうでもいいことならともかく 「製品コードが不変かどうか」を曖昧にしたまま設計はしないわな。 テーブル以外にも影響出まくりだし。 とかいうと 「製品コードでしか検索できない仕様がクソ」 とか見えない相手に反論始めるんだろうけど。
スレを見てるとこんな感じだ。 ○サロゲート厨 客は仕様をコロコロ変えるからテーブル設計はサロゲートがベスト。 俺は大人。反論するヤツはガキ。 ○その他 サロゲートを使うのは要件次第。要件をしっかりと顧客と検討し設計する。
>頭でっかちになるのもいいが、世の中は理屈だけじゃ通らないこともあるんだぜ? 底辺の人はヤクザと仕事しているからそういう考えに至るのですね。解ります。 >客の言質が取れて金が貰えればいいってのはガキの主張だ。 普通に職業プロの行動原理かと。 ボランティア精神溢れるアマチュア精神丸出しでナニ言ってんだが。
ところで、 こういうケースは自然キーがいい、こういうケースはサロゲートキーのほうがいい というのはないの?
「サロゲートキーに自然キーを使う」ということをやろうと思えばできる? って、サロゲートキーって正確なところの意味は何。 正確には自然キーの対義語じゃないんじゃないの。
>こういうケースは自然キーがいい、こういうケースはサロゲートキーのほうがいい >というのはないの? 業務知識とか欠如した人間が設計する時に下手にサロゲートを導入していくと、 システムが複雑になって工数がかかり、顧客からカネをブン取れて、 メンテも面倒なケースがあるので、維持コストも高くて保守費用が 高くなるから、そういう意味でメリットはあると思うが。
>>668 >業務知識とか欠如した人間が設計する時に下手に
であれば、サロゲートキーでも自然キーでもだめでしょ。ばかなの?
要件をしっかりと検討するのとは別の次元で、IDを主キーにするのは有用だと思うよ。
自然キーを主キーにするメリットってあるのだろうか
余分な列を減らせる、とか?
若造なのですがサロゲートキーの場合、JOINのON句で悩むような気がします。 コメントなりなんなりに「○○で一意になる」などと書いておくのが定石なのですか? ご批判お願いします。
>>673 それ逆じゃないの?
サロゲートキーは自然キーが複合キーなど技術的な理由で扱いづらい場合に
使うもので、関連のあるテーブルは当然サロゲートキーで結合するものだよ。
これまでも出てるけど、
自然キーについての十分な検討をしないままID列をつけておけばいい
といった考え方をするのがおかしいといってるわけで、
そういった考え方をしている人は否定派の脳内にしかいないように思えるんだがね。
顧客から提示された自然キーを無批判に主キーにしてしまうというのも 逆に肯定派の脳内にしかいないな。
>>675 そんなこと言っているやつは君の脳内にしかいないな
>>673 ON句は関係ないんじゃないかね?
SELECT * FROM foo JOIN bar ON foo.id = bar.foo_id
「○○で一意になる」というのは普通にユニークインデックスや制約をつければいい。
否定派(というか一人だけ?)は主キー以外のキーは存在しないと思っているのだろうか?
>>666 EJBやRoRといった近頃のフレームワークを使うなら人工キーが主流。
複合主キーはレガシーシステムを扱わざるを得ない場合のオプション的な扱い。
システムがシンプルになって工数が減り、メンテも容易なケースがあるので、維持コストも低くて保守費用が安くなるかもね
One fact in one placeの理念から言っても自然キーは分が悪い。
「○○コード2桁+△△区分1桁+・・・、で××の場合は最後2桁が99」
のように識別子や外部キーとしては不要で、変なしがらみをもった情報が複数箇所に散らばってしまいやすい。
どちらでもイケる両刀遣いになってれば良い。実現手段にサロゲートの呪文しか唱えられないなら客は引く。 客の理解可能なキーの話をして理解してもらった上で 、もしもの保険、サロゲートキーの話に持って行けば良い。 客は今問題になっている点を解消したい訳なんだから、あんまり未来の話(キーが変わるかも云々)をされたって嬉しくない。 フレームワークで勝手に作られる物に関してなら大して気にはしないけど。
あぁなるほど。オブジェクトモデルでしか考えたことがない人だったのか。 そりゃギャップがあるわ。 もしかして、「最近のフレームワーク」しか使ったことがなくて、そもそも インピーダンスミスマッチすら意識したことがないのかもね。
で、自然キーを主キーにするメリットは?
誰かまとめて
>>681 に答えてもらわないと、まとめる価値のあるような議論にならないな
主キーたる候補がある場合、それを主キーにする
自然な話だよな。だから普通にそうすればいい。それが自然キー
主キーたる候補がない場合、あるいはその主キーが使いにくい場合
代わりの項目をつかう。それがサロゲート
主キーが自然キーなのはメリットないよ。自然にそうなるだけで
自然キーを主キーにするのにデメリットが多ければサロゲート使うだけ
>>678 「○○コード2桁+△△区分1桁+・・・、で××の場合は最後2桁が99」
あのな、コードの一部を抜き出してなんかしないといけない時点で、設計が間違ってるんだが
最近のフレームワークが代理キー推奨なのは、こういうアホな設計でもなんとかできるようにだな
代理キーつくった時点で、代理キーと本来の自然キーとのしがらみを増やしてることにも気づけよ
まずサロゲート(代替)キーという呼び方をやめた方が良い。
>>681 客も設計者も理解が早い。そのシステムの世界での共通語で構成されてるから。ほぼ妥当だろうしユーザレベルでの検証も可能だしアンドキュメンテッドな仕様による不都合の指摘も貰える可能性が高い。
…まとめが見てみたいからとりあえず書いてみた。
>>684 主キーたる候補って「○○コード2桁+△△区分1桁+・・・」が多数じゃね?
いくらユーザが「変わらない」と言ったって、主キーにするには弱いと思う。
>主キーたる候補がない場合、あるいはその主キーが使いにくい場合
>代わりの項目をつかう。それがサロゲート
ここで思考停止してるんだろうな
自然キーの代わりとしてではなく、積極的に情報を指すポインタとして主キーの実装は人工キーにしたら良いと主張しているのですよ。
>>686 ありがとう
仕様、外部設計と呼ばれるような部分は、もちろんそれで良いと思う。
人工キーの導入は正規化の一種といえるのではないかと思った。 ユーザと打ち合わせるのは正規化前の状態。 正規化したテーブル構造をユーザは理解できないし必要もない。 情報の分散、重複をなくして変更に強くする。 そういえば正規化を理解していない人を相手にしているのと同じ感じを受ける。
その主キーと自然キーだけのテーブルを作るの?
>>689 その必要はないな。非NULLでユニークなキー(候補キー)がテーブルに2つあるでいい。
>>687 ○○コード+△△区分で主キー候補なら、人工キー作れば良いと思うよ
○○コードの下2桁+△△区分の上1桁とか言い出したら設計が間違ってる
で、お前の言う
>自然キーの代わりとしてではなく、積極的に情報を指すポインタとして主キーの実装は人工キーに
ってのは、○○コードだけで主キー候補たる場合でも
○○コードを主キーにせずに人工キーを作れって主張だと理解してOKなのか?
>>691 >○○コードを主キーにせずに人工キーを作れって主張だと理解してOKなのか?
そうだよ。
○○コード+△△区分って程度の複合キーでも人工キーにしちゃうの?
だったらかなりの部分が人工キーにならないかい?
いっそ全部人工キーに統一しちゃえばすっきりすると思わないかな。
それ以外で主キー候補たる自然キーって少ないよね。例えば何かあるかい?
複合で主キーなら人工キーつくる場合が多いな、俺なら たけど、>いっそ全部人工キーに統一しちゃえ ってのはそれこそ思考停止 全部に人工キー作れって主張があるのはしってるし 実際俺は全部のテーブルに人工キー作ってみたこともあるぞ その結果で言えば、全部に人工キーつくるのは明らかに無駄な作業を増やすだけ ORマッピングとか前提なら話は違うのかもしれんがな
業務で出てくる○○コードって 「分類区分1桁+西暦2桁+連番2桁+サイズ+色」 「入学年2桁+学科区分2桁+連番」 のような体系になっているんだよねえ
厨房の宿題みたいな体系だな。 漏れの知っている保険関係のテーブルだと、加入者テーブルは 加入者コードが一意で主キーで、保険商品が4種類(A,B,C,D)あったとしたら A+連番10桁 B+連番10桁 C+連番10桁 D+連番10桁 てなかんじでほどよい(?)いい加減さがあったぞ。 個人的には、こんなん連番12桁にしておいて、別カラムで保険商品コード持たせれば? って思ったものだけど。 とは言えこれでサロゲートキー作って主キーにしようとは思わんな。 これらの関連として会員テーブル、送付先住所テーブル(愛人対策テーブルとも言うw)、家族テーブル、変更履歴テーブル とかあるが、それらにサロゲートとか使っていたらウザくてしょうがない。むしろミスが増えそうだ。
>>695 人が扱うにはその方が都合が良いから、そのコード体系が悪いわけではない。
人かコンピュータかどちらが扱うのか、ドメインが違えば正しい解も違う。
> 連番12桁にしておいて、別カラムで保険商品コード持たせれば?
> って思ったものだけど。
それが人工キーだろw
695のいうサロゲートは連番なんだろう。
>>687 それって古のネットワーク型DBや、その焼き直しであるオブジェクトDBの考え方。
主張するのは別に悪いとは言わんが、それが当然と考えているならアレだ。
業務で扱っているコードなんて、担当者がコードだけみてある程度情報を判断できるように作るものだからな。 そうじゃなければただの連番になるだろうし、そうなるとコンピュータが採番するか人が採番するかの違いだけで、そりゃ人工キーだろって話よ。
まあDOA(笑)の人なんだね
かすみなんて知らないが。
主キーで使っているコードに意味を持たせてしまうと主キーの変更が発生しやすくなる。 そうならないように管理されているなら問題ないが、 一意性と可読性を両立するのは難しいこともあるなぁ。
>>687 賑わってるww
>積極的に情報を指すポインタとして主キーの実装は人工キーにしたら良いと主張しているのですよ。
そういう考え方があるのも理解してる。DWHで使うようなスタースキーマ構造を作るんならそれだろうと思う。
理論というか、理想としてそういうのはあってもよいと思う。
でもね、企業の業務コードってのはその企業が活動するための物だから、活動が続く以上変化し続けるのよ。都合のよいように。
「業務コードが変わったり」する事は織り込み済み。定期的なコード洗い替え処理やるしね。
業務コードを変えて、ひも付けや関連情報を変更することを必要としてることも多いのよ。
サロゲートキーで「業務コードが変更されてもだいじょうぶ」にするのもやり方だけど、変更を許してそれによって円滑に進めるやり方もある。
だから
> 仕様、外部設計と呼ばれるような部分は、もちろんそれで良いと思う。
なんて聞くと、と正直「大丈夫?」とか思う。ヒアリングの結果どうすべきか(大好きなサロゲートキーを使うかどうか)判断するくらいの余裕を持とう。
>>703 >サロゲートキーで「業務コードが変更されてもだいじょうぶ」にするのもやり方だけど、変更を許してそれによって円滑に進めるやり方もある。
違いがわからん。
>業務コードを変えて、ひも付けや関連情報を変更することを必要としてることも多いのよ。
これは完全にズレてる。
>>703 >でもね、企業の業務コードってのはその企業が活動するための物だから、活動が続く以上変化し続けるのよ。都合のよいように。
だから主キーにはしない方がいいんじゃないの?
むちゃくちゃだな。
>>703 >サロゲートキーで「業務コードが変更されてもだいじょうぶ」にするのも
>やり方だけど、変更を許してそれによって円滑に進めるやり方もある。
何が言いたいのかわからんw
>>でもね、企業の業務コードってのはその企業が活動するための物だから、活動が続く以上変化し続けるのよ。都合のよいように。 >だから主キーにはしない方がいいんじゃないの? 別にさっきの流れの話で言うなら保険商品テーブルに保険商品コードがあって 今まで企業がA,B,C,Dの商品を持っていて、新たにE,Fと言う 商品を扱いだしたら、別にテーブルに内容追加するだけでは? この場合保険商品コードがそのまんま主キーでも問題ない。 なんかサロゲート厨ってなんでRDBの利点を自ら否定しているノリがあるよな。
議論が人工キーと意味のあるコードから構成されるキー(仮に有意キー)の選択という のに変わってきたのかな。この話題なら興味はあるよ。 基本的に有意キーは一意性と不変性が保障できれば主キーとして使える。 構造もシンプルになる。 業務系のコードの場合はこの条件を満たすことが多い。 トランザクションや台帳系の場合は変更が多いから不変性が保てないことが多い。 一意性の確保ために枝番を付けたり、 逆に一意性のためには冗長なほど多くの意味のあるコードを含んでしまっているケースがある。 この場合は人工キーを主キーとしてその他必要な情報はタグとして別途付けるのがよい。 一意なキーが不要で存在しないレコードの場合は人工キーを付ける。
これはサロゲート圧勝な感じだぞ・・・アンチは意味がわからん。 頑張れアンチ!
RoRの意味無くなんでもid付ける主キー設定も馬鹿っぽくて嫌。ちゃんとした設計を放棄してるとしか思えない。 EJBのほうはシラネ。 サロゲート使えば解決出来るってことだと結局、設計が不味くても何とかなるってだけでうやむやになって、これまでと同様にこれからも変わらないと思うけどね。 サロゲート設定しなくても済む様なまともな設計をまず行うべきだと思う。 現場の業務で、製品コード無しで処理している以上、製品コード無しで検索出来ないのようなのは糞システムでしょ。現場の業務のヒアリングが足りない。
アンチからまともな意見がでてサロ厨が「あ、なるほど」となれば議論も深まるのだけど。 710が根源的に勘違いしているのだけど、「全部idを主キーにする」からって業務キーの洗い出しをしないわけではないんだよ。 ってか主キー以外では検索できないと思ってる? > 現場の業務で、製品コード無しで処理している以上、製品コード無しで > 検索出来ないのようなのは糞システムでしょ。 わけわからん。落ち着け。
>>707 >今まで企業がA,B,C,Dの商品を持っていて、新たにE,Fと言う
>商品を扱いだしたら、別にテーブルに内容追加するだけでは?
RDBの利点ってそんなとこにないよw
そして保険の例も下らなすぎ。
業務拡張や合併に合わせて既存の商品コードをA1,A0,B0,Xにします。
ときたらどうなる?
「不変です」と言う顧客のシステム担当の権限をはるかに越えたところで
業務コードの変更というのは起きるんだよ。
サロゲート厨ととオブジェクト厨は一応区別した方が良いと思うが、オブジェクト厨自身 それを混同しているところがやっぱり厨なんだよな。 オブジェクトモデリングの考え方では、オブジェクトは厳然と存在していて、それを 特定できるIDがあればよい。そもそもリレーショナルモデルと考え方が異なるから、 キーという概念やリレーションの正規化という考え方が存在しない。 問題は現実の問題領域との対応が正しいかどうか、例えば実際の商品は1つだけなのに システム上のオブジェクトが2つになっていたりしないか、というところなんだけれども、 オブジェクト指向設計ではそれはデータモデルには表現されず、オブジェクトの 「ふるまい」によって保証されなければならない。 変更に強いと言っているのがおそらくこのためで、データモデルを大きく変えなくても ふるまいを変えればいいジャン、と。プログラムよりデータの方が安定だとするところ から出発するDOAとは逆の考え方になる。 これも最初に抽出したオブジェクトは安定だという前提なわけで、それがひっくりかえる ような変更があったら同じことなんだけどね。
>>708 >基本的に有意キーは一意性と不変性が保障できれば主キーとして使える。
>構造もシンプルになる。
そして複合主キーにならなければ、でしょ?
なんだかなあ
>業務系のコードの場合はこの条件を満たすことが多い。
多くないでしょw
>>713 ユニークインデックスやユニーク制約ってしってる?
>>713 >変更に強いと言っているのがおそらくこのためで、データモデルを大きく変えなくても
>ふるまいを変えればいいジャン、と。プログラムよりデータの方が安定だとするところ
>から出発するDOAとは逆の考え方になる。
これだけなのに矛盾してるw
データモデルを大きく変えなくても振る舞いを変えればいいから、データの方が安定するんでしょ?
不安定な業務キーを主キーにしてしまえばデータが不安定になっちゃうのに.
といったところでお開きにする。くだらなかった。
なんか論理的な設計と物理的な設計を混同してないかな。 複合キーは避ける、ORMではID列が推奨、 とはいうのはDBMSやミドルウェアを使う上での要求や制限であるわけで、 本質的な設計が終わってから追加すればよい話なんだがね。
主キーって実装よりの話じゃねーの?
アイデンティファイアの話ならともかく、キーと言ってる時点で実装寄りの話だな。
主キー索引と主キー制約で違ってくるよ。前者が実装より。
アンチ 一人 vs サロ厨+その他 な構図?頑張れってアンチ!
>>716 「安定であるとする」というのは考えk他の前提であって、「安定させる」という
目的とは違うんだが。安定なコードを選択するのは分析段階の仕事であって、
仮にそれが実は安定じゃなかったといったら分析の失敗。
なぜか「業務キー」は後から変更されると決めてかかっているようだけれども、
そういう先入観に囚われていたりすると間違いやすいわけだな。逆もしかり。
というか、思い込みとしては確かに逆の方が多いと思うけど。
>業務拡張や合併に合わせて既存の商品コードをA1,A0,B0,Xにします。 >ときたらどうなる? 現実に起きないケースを言われてもな。 仕事したことあるの? 仮にそんな命令だす会社があるなら晒してみれば? 銀行が合併や統廃合しても旧支店名や旧支店コードが変わることはないんだが。 「既存の○○コードを■■にします」と言うのなら、新規にコード追加と 変換テーブル用意すればいいだけで、サロゲートなんて仕組みは必要ない。 >「不変です」と言う顧客のシステム担当の権限をはるかに越えたところで >業務コードの変更というのは起きるんだよ。 単にシステム責任者が「はい」しか言わないヴァカだからじゃないのか? システムでソレを実行したら、どれほどのリスクが発生しそれらに関する修正体力がどれほど必要か 説明すれば、いくら上がヴァカでも、システムに対する理不尽な要求を撤回してくれる。
ごめん、もうお開きなんだわ。くだらないし
おつかれ、もうこなくていいよ。
結論 ・主キーは自然キーでもサロゲートでも良い ・大事なコードが「可変か不変か」「一意か重複か」は主キー云々とは関係なく当然事前にキッチリつめておくべき ・「サロゲートキー使うから要件確認なんて適当でいいだろ」とはかありえない
ん?もうネタ切れか?
>>725 「製品コード 変更」でググってみなよ
>>703 ではこんなふうに言ってるのにね
>でもね、企業の業務コードってのはその企業が活動するための物だから、活動が続く以上変化し続けるのよ。都合のよいように。
>「業務コードが変わったり」する事は織り込み済み。定期的なコード洗い替え処理やるしね。
>業務コードを変えて、ひも付けや関連情報を変更することを必要としてることも多いのよ。
変更されないなんて言われて真に受けて主コードにしちゃって後で困るのが、そもそもの設計ミスなんじゃないの? そんな設計ミスで後から改修費用取るのは詐欺。金貰って喰ってるプロなら最初からちゃんと設計ぐらいしないと。 急にボールが来たとかいい訳して仕事しなかったサッカーの素人並。
また「サロゲートキーがにしたから要件は適当に聞いておけば大丈夫」厨か。 そこをちゃんと確認しとかなきゃ仮にDBが無事でもプロジェクトはボロボロだっての。
「製品コードは将来的に変更されませんか?」 とユーザーに尋ねたら、 「将来、変更がかかっても最小の修正ですむような設計にしてください。」 という返事が返ってくるんじゃないの? 「将来にわたって変更はありません」 とは言わないだろ。
キッチリと確認した結果「変更されるケースあり」と確定したんならそれでいいだろ。 曖昧なまま「どっちでもいいよ。なんせサロゲートキーを使ってるからな」がありえないって話だ。
>>735 それはOKなんだw
よくわかんねーやつだなwww
>>736 いや何もおかしくないだろ。
「サロゲートキーか否か」がプロジェクトより大事な人にはわからんだろうけど。
別にこっちは「サロゲートキーを使わない」事に命をかけてるわけでもないんで。
またわけのわからないことを言い出したぞw
反論できなくなって逃げ回り始めたか。 そうやってワザと馬鹿のフリをしてスレを盛り上げようとしてくれてるんだろ? わかってる、愛してるよ。
>>735 >曖昧なまま「どっちでもいいよ。なんせサロゲートキーを使ってるからな」がありえないって話だ。
林: まさかとは思いますが、この「どっちでもいいよ。なんせサロゲートキーを使ってるからな厨」とは、あなたの想像上の存在にすぎないのでは
ないでしょうか。もしそうだとすれば、あなた自身が統合失調症であることに
ほぼ間違いないと思います。
こっちは要件を確定しろ、と言ってるのに それに対する反論が「サロゲートキーを使え」だからな。 そんなレッテル貼りやったりネタで逃げたりしなきゃならないんだろ。
こっちは要件を確定した上で人工キーを使え、と言ってるのに それに対する反論が「要件を確定しろ」だからな
そんな反論はしてないが。 必要だと確定して使うんなら問題ないだろ、と言ったはずだが。 そんなウソをついてまで「まだ反論できてるフリ」しなくていいよ。
おはよ〜、まだやってたのか。 人工キーを活用するという話とサロゲートキーの話が混ざってないかい? 製品コードは有意キー(人間から見て意味のあるキー)にしたいというニーズは強いんだが、 製造と販売で盛り込みたい情報が違ってたり、世代の管理をしたいとかいろいろあるんで、 主キーは人工キーにしてバーコード化している。 と同時に製造タグコードと販売タグコードを別にふって印刷している。 タグコードは両方ともユニークではない意味のあるコード。 ひとつの考え方でいかなる場合もそうであるわけではないのだが、 枝番をふって主キーにするよりも人工キーを活用したほうがよい場合もある。
>>744 そんな感じだと思うよ。
絡んでくる変なのがいるからかまってるだけで。
しかしみんな朝早いなw
>>745 おいおい
>>744 は「要件を確定させ、必要だとわかった上で」「人工キーを活用した方が良い場合もある」という話だぞ。
君が全否定されてんの。
アンチの挙げる例がアレなんだよな A+連番10桁とかそんなんだもんな
不変で一意で単一の自然キーか。。。
サロ厨もアンチも一部の馬鹿が極端な例とか使って変な方向に持って行ってる気がする。 アンチの方が変なの多い気もする。
製品コードで検索出来なくて文句言われた。 サロゲート使えばおk そもそもサロゲート使う設計が糞。 サロゲート使わない事に命掛けてる訳ではない。 <今ここ 要件確定してるのでサロゲートなんて使ってませんが? じゃあサロゲート要らないね。 終了。 銀行の支店コードが統廃合で実際変わってたね。まだ現金で給料貰ってる香具師なんだろうか。
なんでもいいが、お前ら名乗ってやってくれ だれがどんな主張かわからんぞ
アンチは何人?ひとり?
アンチってのはいないだろ。 「必要かどうかを判断すべき派(中立派)」と「何が何でも使え派(サロ厨)」がいるだけで
756 :
703 :2009/06/28(日) 16:00:10 ID:3qHYmqKK
もしかして私、アンチサロゲにされてる? 発生する企業コードの変更に、意味ある対応ができるならならサロゲートキー使えばいいと思いますよ。 だけど単純に「変更が発生するから云々」でサロゲートキー使う反射神経野郎はどうかしてる。と思ってる。 #サロゲートキーを否定してる訳じゃないので。 企業コードなんてのはガンガン変わるもの。その変化するコードに後生大事に不変のキーをくっつけて持ちまわすことに意味があるのか? 洗い替え作業って、単にコードを直すだけじゃない。組織構造の変更や移管・移行に伴う関連性の張替え組換えだってやる。場合によっちゃ元の構造を壊して作り変える。 企業コードの他に、使いもしないような別キーについても面倒見なくちゃならないのは正直ろくでもない手間としか映らない。 もちろん、ろくでもない手間ではない、ちゃんとメリットの見える設計なら歓迎。 「〜な理由で不変なキーが必要です」とか言った企業活動に必要な、明確な理由があってのサロゲートキーやら何とかキーなら理解できる。 ただ「将来の保険」的なものや「コードが変わっても元の構造を維持できる」とか、でしかないなら余計な工数が必要なお粗末設計なだけ。
素朴な疑問 サロゲートキーをつける事で発生する「余計な工数」ってなんだ?
付けただけじゃ大した工数じゃなくても 「キーが変わる・重複する」事を考慮して全体を作ると結構な工数。 そこは要件をきちんと詰めて「これだけかかりますが両対応にしますか」と合意を取らなければならない。
>>755 >「必要かどうかを判断すべき派(中立派)」
自分ではそう思ってるんだな。
すまんが、傍観者から言わせて貰うとまったくそうは見えないぞ。
>>756 君はアンチサロゲっつーか日本語でおkっつーか・・・
傍観者w
反論できなくなると ・話をそらす ・見えない敵と戦い始める ・バレバレのウソをつく ・自演を始める もう飽きたよサロ厨
「状況を判断して使うかどうか決めるべき」が中立でないとすると 「何が何でもサロゲートキーを使うべき」に同意しない人は全てアンチか。 怖いなw
サロゲート厨とはどんな人物か。
>>735-
>>736 のやりとりを見れば
「何が何でもサロゲートキーを否定するアンチ」を脳内で作り出して
それと戦っているつもりになってるのは明白だろう。
相手が中立であってはならない。
確かにサロ厨がかなり必死なスレですな。 反論っぽいのも的外れだしなぁ。 必死にググった結果もアレだったし。 中二病とおなじく「サロゲート」といいたいだけと違うのか?って希ガス。
>合併するなら重複が発生するだろう
>
http://www.bk.mufg.jp/oshirase/tenban/furiwake.html 漏れ、ここの銀行の2世代前(倒壊銀行)の古い合併前の通帳やキャッシュカード使っても問題ないよ。
つかサロゲートの人ってシステム設計した事無いんじゃね?
とりあえず、漏れはちょっと中の人だけど銀行の統廃合で過去のコードは無かったことにされないよ。
サロゲートキーとか使わずに実装している。合併したらそれは新しい銀行なので、旧銀行とは区別されている。
>「業界でコード体系を統一しよう」という大きな動きを、システム責任者ごときが「NO」と言えるか?
全銀の世界ではすでにコードが統一されているよ。銀行のシステム担当者はこれに合わせるだけ。
と言うかあわせないといけない。
基本的に旧コードをないがしろにしていない。古い手形・小切手を持っている人が泣くだろ。
手形には主キーと言う概念がないので例えとしてはアレだが。
とりあえず、そんなに自説に自信があるならMUFGにいって「オレに設計させれ」と言って来い。
サロゲートの人は本気で病気だと思うからここで現実逃避してないで、
マジで精神カウンセリングを受けたほうがいいと思うよ。
>>765 そりゃあできるだろう。
できるかできないかではなくて、改修にかかわるコストの論議をしているんだと思うんだが。
ちがうか?
新しい展開がwww 製品コードで検索出来なくて文句言われた。 サロゲート使えばおk そもそもサロゲート使う設計が糞。 サロゲート使わない事に命掛けてる訳ではない。 サロゲート使えば改修費用が安く出来る。 <今ここ 要件確定してるので実はサロゲートなんて使ってませんが? じゃあサロゲート要らないね。 終了。 コストなんて末端のPGを低賃金で雇うなり、サビ残では足らせればいくらでも圧縮可能と、予算管理者や経営者は考えてる罠。 予算はサロゲートで決まるんじゃない。エクセルの上で決められている。
文章ヘタクソだなあ。 君の書いた要件定義書をぜひ見てみたい。
>>767 > コストなんて末端のPGを低賃金で雇うなり、サビ残では足らせればいくらでも圧縮可能
あはーん、だからよくダウンするんだ。MUFGのコンピューターシステムは。
>>767 とサロ厨で別スレつくって出て行ってくれればスッキリする。
サロ厨が何の反論も出来なくなったところに、わざわざエサをまきに来るなよ
いや、隔離スレがここだから。
本スレどこだよ。本スレはサロゲート廚来ないのか?
>とりあえず、漏れはちょっと中の人だけど銀行の統廃合で過去のコードは無かったことにされないよ。 >サロゲートキーとか使わずに実装している。合併したらそれは新しい銀行なので、旧銀行とは区別されている。 実際の口座テーブルの主キーは何なのでしょうか。
>>755 >アンチってのはいないだろ。
>「必要かどうかを判断すべき派(中立派)」と「何が何でも使え派(サロ厨)」がいるだけで
何が何でも使え派ってどれ?
あなたが総合失調症の人ですか?
>>774 ん?君も「状況を判断して使うかどうか決めるべき」って考え?
よせ、病気がうつるぞw
>>767 >製品コードで検索出来なくて文句言われた。
>サロゲート使えばおk
>そもそもサロゲート使う設計が糞。
>サロゲート使わない事に命掛けてる訳ではない。
>サロゲート使えば改修費用が安く出来る。 <今ここ
>要件確定してるので実はサロゲートなんて使ってませんが?
>じゃあサロゲート要らないね。
>終了。
これがまるっきり意味分からんのだが。
誰か解読してください
>>765 本当にアレだな。
>ここの銀行の2世代前(倒壊銀行)の古い合併前の通帳やキャッシュカード使っても問題ないよ。
問題ないように苦労してシステム作るだろ、普通。
その時に自然キーよりも人工キー使ってたシステムの方が対応しやすいんじゃないかなって。
>ちょっと中の人だけど銀行の統廃合で過去のコードは無かったことにされないよ。
「過去のコードをなかったことにする」なんて誰か主張したかい?
>全銀の世界ではすでにコードが統一されているよ。銀行のシステム担当者はこれに合わせるだけ。
>と言うかあわせないといけない。
もっと一般的な話をしたつもりなんだが。
必至に話をそらし中w
どのポジションの奴も自分は頭がいいと主張しているだけだなw
>>765 >漏れはちょっと中の人だけど銀行の統廃合で過去のコードは無かったことにされないよ。
当たり前だバカ。そんな話してるんじゃないよ。
どうかこの人と仕事で関わりませんように
>>756 >企業コードなんてのはガンガン変わるもの。その変化するコードに後生大事に不変のキーをくっつけて持ちまわすことに意味があるのか?
過去との紐付け
サロ厨って反論できなくなったら唐突に遡って反論可能な書き込みに対してレス始めるのなw
中立派の人に質問。 第一正規化、繰り返し項目の排除についてどう思う? 「必要かどうかを判断すべき」だったりする?
また露骨に話をそらして 完全に反論できなくなったのを「無かったこと」にしに来たなw
思い出した。この前のとおんなじ奴だろ。文末wは
またそういう部分で争ってうやむやにしようとするw
>>787 専スレ立てようか?
正直、サロゲネタはお腹いっぱい。
>>788 >正直、サロゲネタはお腹いっぱい。
同意
専用スレもいらんよ
結局サロゲート設定する必要無いだろ。
いやもうそこに触れないで
795 :
NAME IS NULL :2009/06/30(火) 00:17:18 ID:cjciCkCN
これだけ理屈の通じない人間がDB設計に関わってるんだものな
いや別に君を擁護してるわけでも無いから
偏向性サロゲート厨
結局は自称中立野郎が脳内敵を勝手に作り出して暴れていたってことでw
はい、そろそろまとめて。 サロゲートキーのメリット、デメリットと どんな時に使うと良くて、どんな時は良くないのか。
電話を使った会員サービス、世帯単位なので電話番号をそのままユーザー番号として使っている。 こういう業務を想定した上で、これをシステム化する。 A) 電話番号を主キーとして使用。 B) ユニークな連番(ID)を発行し、主キーとするが電話番号も候補キーである。 ユーザーは主に電話番号を使う。IDは管理番号としてバーコードなどに使用する。 C) ユニークな連番(ID)を発行しユーザーに通知、これを主キーとする。 電話番号は問い合わせに使用できるが基本的に一属性である。 D) ユニークな連番(ID)を付加するがユーザーには非通知。システムの内部だけで使用する。 電話番号は候補キー Aは自然キー、Dはサロゲートキーで間違いないと思うが、BとCは解釈が分かれると思う。 ABCが自然キーでDが人工キー=サロゲートキーが正しいらしいが、 Aが自然キー、BCDがサロゲートキーでないが人工キー、 Dがサロゲートキーというのが一般的だと思うけどどうだろう。 BCDがサロゲートキーと解釈してる人もいそうだけど、 この辺の意識あわせはしないとややこしくなりそうだ。
一箇所訂正。 >Aが自然キー、BCDがサロゲートキーでないが人工キー、 Aが自然キー、BCがサロゲートキーでないが人工キー、 私的にはABCが自然キー、Aは特に有意キーと呼んでる。
電話番号は変更される事も有るから、契約番号を設定してユーザ番号として利用すればサロゲートは不要。 そもそもユーザ番号を一意にすれば良いじゃないか。やっぱり設計が大事。 サロゲート廚はまともな設計が出来ないだけじゃ。
その一意になるユーザ番号って人工キーじゃんw
ほんとその意味で言えば「サロゲート派」なんて一人も居ないのに なにを騒いでるんだか。
>>803 「うちの業務は電話番号で検索できればいいから、変な契約番号なんてつくりたくないんですけど。弊社の業務分析はちゃんとできてます?」
「電話番号は変更されることもある?そんな事わかってますよ。とにかく電話番号で検索できることが重要なんです!」
そのケースだったらBパターンだな。 つうかBもサロゲートということにしないとサロゲート派の立つ瀬がないな(笑
傍観してた初心者ですが、A以外はサロゲートなのかと思ってました。
脳内で勝手に作った「サロゲート派」と戦ってたのか。 なるほどかみ合わないわけだ。
>>807 >つうかBもサロゲートということにしないと
普通にサロゲートキーじゃん
811 :
808 :2009/06/30(火) 17:40:06 ID:???
??誰がホントなんですか?
初学者は自分で勉強しろ
おまえらは仕事しろ
>>801 サロゲートだなんだ言う前に、
>世帯単位なので電話番号をそのままユーザー番号として使っている。
これが適切なのかどうかはっきりさせてから設計に入るべきだね。
で、一旦これが適切だ=世帯と電話番号の関係性に変更はない、という
判断がされたのだったら、それ以降電話番号の変更の可能性を考える
必要はないわけだし。
>>814 > 電話を使った会員サービス、世帯単位なので電話番号をそのままユーザー番号として使っている。
> こういう業務を想定した上で、これをシステム化する。
はっきり「想定した上で、これをシステム化する」と書いてますから、ここでは既に「はっきりさせて」あると思うのですが...まだ足りないと言うことでしょうか?
それが適切でない合理的疑いがあるのなら、質しておくべきだね。 業務ルールとかも詳しく見てみると、人が判断してるからなんとか 回っているけどシステム的には全然つながらない、なんてのが あったりするしね。
俺はA以外はサロゲート扱いだなぁ。 んで、実装はB〜Dのどれかに落ち着きそう。 電話番号が変わったときに過去履歴を見るのに別にキーがあると便利そう。 もちろん顧客に電話番号以外にキーを持たせることによるメリット等を説明した上でね。 ちなみにアンチサロゲの人から言わせると俺はサロゲ厨w
サロゲ厨はこれに回答してから中立ぶってくれ
774 名前:NAME IS NULL[sage] 投稿日:2009/06/28(日) 22:52:35 ID:???
>>755 >アンチってのはいないだろ。
>「必要かどうかを判断すべき派(中立派)」と「何が何でも使え派(サロ厨)」がいるだけで
何が何でも使え派ってどれ?
あなたが総合失調症の人ですか?
775 名前:NAME IS NULL[sage] 投稿日:2009/06/28(日) 23:00:02 ID:???
>>774 ん?君も「状況を判断して使うかどうか決めるべき」って考え?
そもそも電話番号は変わると確定している物。 それを前提に話すのがおかしい
>>821 君の「都合が悪いレスは見えないフリ」を隠そうともしない姿勢は凄いね。
>>818 おれは何が何でも使え派と言ってもいいかもな。
「何が何でも」というのは語弊があるが。
自然キーを主キーにしてOKといえるケースの少なさ。
人工キー導入コストと主キーの変更コストの比較
設計ルールの単純化のメリット
これらをしっかり理解できれば、作業としては人工キー一択で良いと思う。
>>822 もういいじゃん。
そいつマジ病気なんだから。
>>818 だからさ、専スレ立てるかって言ってんだろうがよ。
単なる煽りか?もっと賑やかなところでやれよ。
ぐだぐだ言ってないでさっさと立てろよ
他に話題もないしいいんじゃね? これか、「リレーションはテーブルのことだよ論争」しか話題がないじゃんw
まだやってたのかおまいらwww
その話題になるとあの人がいついちゃうのがね… スレが止まってもいいからその話題以外にしましょう。
もともと数日レス無しとかが普通なスレだしな。 レスがあるだけ今のほうがいいか、と聞かれると明らかにNo
なんかすっかり話題を変えられてるが、 製品番号で検索出来ないのは設計が悪いぞ。
常識的に考えて それはDB設計が悪いんじゃなくてアプリの設計が悪いんだろが 製品番号で検索したらパフォーマンスが出ないってなら別だが
>>801 はここでのサロゲートキーの定義が曖昧だからはっきりしろ言ってるわけで
話題を変えるつもりはなかったのだと思うけど、
今を思えば
>>685 が慧眼だったな。
で、製品番号のテーマではA対BCDということで行くの?
>>831 >製品番号で検索出来ないのは設計が悪いぞ。
これがずっと気になってたんだが
>>607 の「製品コードが無い分の納品書は製品コードで検索できない」
を曲解してるのか...。
なんという読解力(どっかいりょく)のなさ。
主キー(しゅきー)がどうのこうの言(い)う遥(はる)か以前(いぜん)の段階(だんかい)ですね
ユーザが製品コードを付けないで入力するのを要件に盛り込んでなかっただけだろ。 設計ミスだな。
後出し要件をどこまで避けられるかどうかだな。 キックオフまでにつぎ込めるリソースも限られた中で、全て洗い出すなんてのは前時代的な根性論か理想論か。 「全て盛り込め」という無責任な号令のもと、巨大な体を持て余して潰れていった数々のプロジェクトの屍を乗り越えて、銀の弾丸ではないものの、よりよい手法を模索していかなければならない。
製品コードで複数ヒットするならいったん候補画面に飛ばさなきゃならない。
製品コードが変わるかどうかでマスタメンテ画面だって変わるし
マスタに紐づく諸テーブルは製品コードを表示するために(製品コードをキーとしないなら)親からとって来なければならない。
プロジェクト全体に関わる問題。
結局のところ、「製品コードは不変としてつくるか可変としてつくるか」の合意を得なきゃ前に進めない。
「変わるかもしれないからサロゲートキーにしました」は何の解決にもなっていない。
客に何を聞いても「全ての可能性を考慮してつくってください」しか言われずそれを受け入れ、
>>836 が言うような対応をするのでなければね。
えーと… 制約というものを知らないのかな? マスタメンテ画面で何の項目を保守可能にするのかってのは別問題だし 通常、リソース系のテーブルは名称やら金額やらを取得するためにリンクするものだし なにがネックで騒いでるのかよくわからん
>>837 >結局のところ、「製品コードは不変としてつくるか可変としてつくるか」の合意を得なきゃ前に進めない。
これはまさにその通り。しかしその合意というのがどこまで有効か。
どうにもならない政治的なこともよくあるからな。
本当に合意を出来るなら「人工キーは無駄」というのに賛同できないわけではない。
あと、 親から取ってこなくても製品コードが表示できる、というのは非正規化に過ぎない。
>>838 勝手に条件を限定して「何の問題も無し」てのは君の悪い癖だよ。
いや、なんとなく こいつ要件定義やったことねーな 的な匂いがしてねw
また例によって露骨な逃げに入ったなw
そもそも業務でいちいち製品コード決めたりしないだろ。 何か適当に作って、後から製品名とコード付けるのが普通。 単に現場知らずに設計してるだけ。現場知らないのに現場のシステム設計出来る訳が無い。 サロゲート付ければ良いってのは、現場知らなくても何とかなるって良い訳。
>>843 >そもそも業務でいちいち製品コード決めたりしないだろ。
え?
>何か適当に作って、後から製品名とコード付けるのが普通。
じゃあDBの主キーは全部人工キーでいいじゃんw
業務知らなくても云々とかいうミスリードはもうやめようぜ。 サロゲートをどうするか以前に、DB設計は業務を知らなきゃできっこないんだから。
>>801 サロゲートキーは、少なくともあるキーを代替していないとサロゲートキーと言えない。
Aは、電話番号が主キーということだけなので、何かを代替(サロゲート)するということは当然出てこない。
Bは、電話番号(候補キー)の代替(サロゲート)としてのユニークな連番(ID)をつける、と言えるから、
ユニークな連番(ID)はサロゲートキーと言える。ユーザーが使うとか管理番号に使うとかは関係ない。
Cは、電話番号はキーではないので、ユニークな連番(ID)が電話番号を代替しているとは言えないので、
ユニークな連番(ID)はサロゲートキーと言えない。
Dは、電話番号(候補キー)の代替(サロゲート)としてのユニークな連番(ID)をつける、と言えるから、
ユニークな連番(ID)はサロゲートキーと言える。(BとDは同じこと)
しかし、サロゲートキーが、必ずユニークな連番(ID)という人工キー
でなくてはならないかというと、そこまではサロゲートキーという意味に含まれていない。
こんなんで、どう。
代替キーと代理キーが混ざってない?
代替キーと代理キーの定義を教えてくれ
>>838 そういうのを本当に汎用的にやろうとすると結局、市販の「いわゆる『アプリケーション』」と
変わらないものになっちゃうんだよな。
普通の設計の感覚で見るとゲロ吐きそうな代物だ。
>>849 汎用的なんて後付け条件つけて勝手に批判した気になってんじゃねーよww
>>850 なんでオマエが批判された気になってんだw
SAPの中の人とかかい?
ググレ、カス
>>851 気づいてないのかもしれないが、君1人対全員だよ?w
>>853 君何度もいわれてるけどホントに病気だから
サロゲ厨は要件定義しない厨攻撃のつぎは SAPまで持ち出して、サロゲ厨は汎用厨攻撃ですかぁ。 大変ですねぇ。
サロゲ廚の言い訳が見苦しいスレだな。
>>848 代替キー(サロゲートキー)は主キーたる自然キーが存在しない、あるいは複合キーとなって扱いにくい場合に、別途人工的に作成するキー
代理キーは一意になる候補キーの内、主キーに選ばれなかったもの
ただし、サロゲートキーのことを代理キーと呼ぶこともある
自分が都合の悪いレスを無視して逃げ回っておいて何を言うんだ?
アンチサロゲ廚の勝利に終わったのか?
どこを読んだらそういう結論になるんだろう。 本当におかしい人なのかな。
廚って書く人は同一人物なのか
女のようだな
漏れさん
866 :
NAME IS NULL :2009/07/02(木) 16:05:31 ID:8NCxXA01
くだらないこと聞きますが 例えば ・お店が一つの業種を選択できる ・一つ業種は色々なお店に選択される このような時 お店:業種 は 一対多 というのか 多対一 どちらなのでしょうか?
業種1つに対してたくさんのお店が紐付くわけだから 業種1:お店多
>>866 「お店が一つの業種のみ選択できる」ならば多(店)対一(業種)
普通はいろいろ遣ってるよね。販売もサービスも。
a. 運送業の会社が、陸運業・海運業を手がけている事 b. デパートが、無料梱包サービスと配送サービスを行う事 c. スーパーが、食料品と雑貨を販売している事 質問の「業種」が a の意ではなくて b や c のような意? a だとすると、お店というよりは会社なのかな。 #「お店」と「複数業種」がなんかうまく釣り合いが取れなかっただけ
873 :
866 :2009/07/03(金) 11:02:35 ID:???
>>867 869
ありがとうございます。
ですよね。
>>871 たぶん
>>866 が言いたかったことは、a, b, c のどれでもないと思う。
そんな難しく考えなくても、普通に“お店テーブル”と“業種マスタ”の関係を
どう言い表せばいいのー?みたいな話かと。
「“お店テーブル” のデータ1件(つまり1つの店舗)につき、そのお店の業種を表す情報を1つだけ持つ
(つまり、1つのお店が複数業種を掛け持ちするようなケースは設計上想定していない)」ような場合、
なんて言えばいいの?って質問では?
答えは
>>867 、
>>869 だよね。
あくまでも「例えば」と言ってる訳だし 聞きたかったのは概念的な話だろう。 例え話の前提条件に異を唱えてもしょうがない。
いやだから、お店や業種ってのは例えなんでどうでもいいんじゃないのかね 1対多や多対1の結合っていったときに どっちが多でどっちが1か聞きたかっただけだろ
878 :
874 :2009/07/04(土) 22:48:47 ID:???
あ、えーと、なんか
>>871 が
>>866 の質問の文意を
理解しあぐねてるように見えたから、差し出がましく
「こういう質問がしたかったんでは?」って
>>866 宛に解説してみただけっス。
もうクローズした話題なんで、適当に流してくだしあ。すんません。
そもそも実際と違う要件で作ってしまうのが問題。 要件定義で漏れが有ると、現場で使えないシステムが出来上がるぞ。
無理やり荒らそうとするヤツが出てくるな
要件定義厨w
それ言いたかっただけだろ。 露骨杉
883 :
871 :2009/07/05(日) 22:55:19 ID:???
>>878 なんか、つまらない思いさせてしまった様で申し訳ないです。
#おかげで「例えば」のかかる範囲がわかりました。
この「例えば○○の様に」と言われた場合、「○○」は質問する方・される方で既存の共通する認識がある実例が来る場合と、
今回の様な場合があるので...
私の読解力が足りないんです。本当に申し訳ない。
>>879 >要件定義で漏れが有ると、現場で使えないシステムが出来上がるぞ。
うわぁ・・・まだそんなところに居る人居るんだ
要件は出来あがってから真面目に聞く
開発部・製作部・経理部やAコース・Bコース・Bコース(特)等 10個以下程度の項目で、かつ項目が追加・編集される可能性のある 種別が沢山ある場合の設計は、どのようにすれば良いのでしょうか? そのまま、下記のように記録するのは良くないとは思いますが 名前 部署 コース ------------------------ 鈴木 開発部 Aコース 佐藤 開発部 Bコース(特) 田中 製作部 Bコース(特) それぞれ別テーブルを作るべきなのでしょうか? 名前 部署ID コースID ----------- 鈴木 1 1 佐藤 1 3 田中 2 3 ID 部署 ------- 1 開発部 2 製作部 3 経理部 ID コース ------- 1 Aコース 2 Bコース 3 Bコース(特) それとも、項目テーブルとして1つにまとめても良いものなのでしょうか? 名前 部署ID コースID ----------- 鈴木 1 4 佐藤 1 6 田中 2 6 ID 項目 ------- 1 開発部 2 製作部 3 経理部 4 Aコース 5 Bコース 6 Bコース(特) 上記のような項目が30個位あるので、項目毎にテーブルを作るべきか迷っています。 DB設計初心者で、プロ(仕事)では無いので、聞く人がいなくて困っています。 どなたか助言をよろしくおねがいします。
一冊ちゃんとデータベース構築の本読めとしか。
部署とコースの関係がわからんから何とも
>>886 どんな用途で使おうと思ってる?
それでテーブルの設計は大きく変わると思う。
「まとめる」っていう選択肢はあまりないように思うけど。
>>885 そういうのありますよね。
客も実物に触れて運用してみないとわからないというのがある。
>>887 データベース構築の本は数冊読みましたが、大体が
>>886 の場合だと
部署やコース毎に項目テーブルを作るようになっています。
>>888 項目と項目の関連性はありません。
>>889 例えば、windowsの画面設定では以下のような項目がありますが
テーマ:テーマ
デスクトップ:背景/表示位置
スクリーンセーバー:スクリーンセーバー
デザイン:ウィンドウとボタン/配色/フォントサイズ
設定:ディスプレイ/画面の色
これをユーザ毎のデータをテーブルに格納する場合
ユーザID テーマ 背景 … 画面の色
-------------------------------------
suzuki WindowsXP さざなみ … 32ビット
tanaka Windowsクラッシック なし … 16ビット
となると思いますが、この時に項目毎にテーブルを作るべきか
項目テーブルみたいなのを作って、まとめるか迷っています。
>>890 そうですか。では、windowsの画面設定等ではテーマならテーマの
項目テーブル。デスクトップ背景であれば背景の項目テーブルを
作った方が良いという事ですか?
具体的な要件が示せないみたいだが、宿題か何かってヲチか?
宿題ではないです。趣味で作っているプログラムです。
具体的な要件は、かなり特殊なので、ここに書くと
かなり長くなってしまいそうです。
>>892 に例えたWindowsの画面設定にかなり近いです。
>>886 名前 項目ID
-----------
鈴木 1
鈴木 4
佐藤 1
佐藤 6
田中 2
田中 6
こういう手もあるかと。
でも、このテーブルを使ってどういう検索をかけるか判らないと何とも言えない。
ちゃんと要件示すか、自分で考えるかだな。
最初から綺麗な設計と運用方針でスタートできるなら問題ないけど 業務を理解してなかったコボラーのファイル設計がつぎはぎだらけで グダグダなデータベースをリプレースしろって言われた俺結構 がんばって再構築してるけど、サロゲートキーは救いの神。
句読点もまともに打てない奴が
そいつがアンチ本人じゃん。サロゲ厨を揶揄してんのに釣られんなよw
>>892 みたいなことがやりたいんだったら
テーブルをどうするとかよりXMLとか使った方がいい気がする
そういやXMLDBってどうなった?
つか、892のWindowsの設定云々はデータベースを使う例としては不適切に感じるが。 なんかデータベース覚えたての厨房がムリにRDBMS使いたい病にかかっている様に感じるが。
コボラーのためにサロゲで回避するのは本末転倒。 結局サロゲ前提の設計から抜けれない罠。 いきなりRDBじゃないと出来ない様な案件に取り組んでも失敗確実とは思う。 エクセルやアクセスで十分な程度もRDBで設計してみて、徐々にステップアップしていくのが基本かと。
設計とはちょっとハズれた話題になってしまうが、職場で学習を兼ねて「こういうのを作れ」とか 言われたら、Excelで作ってみて無理を感じたらAccessで作り、 Accessで無理を感じたら、SQLite3(+Python)でいいんじゃね。 そういうので要件を上手く設計に落とし込めるようになってから、 Derbyとかに手を出せばいいと思うけど。 時々、目的や規模を含めてそういのを判断できずに盲目的に 「この案件Oracle使います」とかヌカすヤツがいるからなぁ。 って漏れの組織のログ収集システムがそんな感じだ。 なぜにこんな要件でOracleと言うかRDBMSを使う必要があるのかサッパリ理解不能だ。w
Access挟むならSQLite要らないわ
最初が Excel ってのはないわ。
全てのデータが65535以内ならExcelでもいいんじゃね? 漏れはやらないけど。w AccessとSQLiteとどっちがマシか?って話だと後者かな。 Accessだとそれこそ病気の様なリレーション組んだりしている素人見るし。
>>906 たしか、そのログのテーブル設計がこんなカンジだった希ガス。
日付:number
ログテキスト:vahchar(256)
で、カンマの無いcsvファイル(?)をちょい加工してインポートすると言う仕組みだった。
CLOBでいいんじゃないか?とかログの読み出し順が保障されてないとか
ツッコミどころ満載だったなぁ。
まあ一度も過去ログを見た事ないので問題になっていないだろうし、
それで多くの人が満足しているなら、それはそれでいい設計なのだろう。
tsvか。 なおさらoracle使う必要がねえな。 vbsで十分。
エクセルとかアクセスとか面倒だからオラクルで良いよ。 どうせ行き着く所はオラクル。 スキル評価でも、エクセルやアクセス使えますよりも、オラクル使えますのほうが待遇よかったり。 がんばれば簡単に出来る事でも、評価されない事は自分の評価を下げるだけ。
どういう現場をどさ回りしてるか目に浮かぶ
910を実現するためにoracleなんていれたら無能の証明だろw あんな重いもんこんな用途に使うには適してない。
そりゃまあ、営業の数字的にはOracle使う方が客から金搾り取れるから、 ベンダーとしては評価があがるのかもしれんけどな・・・。 Oracleみたいなソフトを一度導入してしまうとサポートやらの保守とかで かなり美味しい商売が展開できるし、「Oracle入れているなら次はコレも」 とか営業が夢語りやすいからなぁ。 社員として優秀と、エンジニアとして優秀は違うよな。 社内SEの人はベンダーがOracleって単語使い出したら気をつけろよ。w
ベンダーって言葉、俺の中じゃOracle社とかのことなんだけど。
DBはなんでもできる夢の道具じゃねえぞ。 馬鹿いうのもいい加減にしろ。 システムを構築する上でひとつの要素でしかない。 oracleでしかできないことなんてほとんどない。 サポート?保守?そんな金のかかるシステムしか構築できんのか? って言ってくれる客がいてもいいはずだ。
んならテメエの会社で開発汁。 と言ってみたいテストw
わかってないなあ君たちは・・・オラクルでもMSでもいいけど、 「○×のバグです。」「△□の機能では無理です。」 これで逃げられることがどれだけありがたいことか・・・
本質的に無理な事と逃げ口上は別モノだが。 逃げ口上で使っているならそれこそ無能の証明だろうに。
本当にムリだったとしても代案を出さなきゃだしな。
そこんところ、結果責任を追及される可能性はフリーDBMSの方が高い ような気はするけどね。「なんでそんなもの選んだ」と。
そういうケースは現実にあるのか胡散臭いんだが。 むしろ、高機能なOracleとかにシフトして障害発生とかあったりするし。 たとえば、Oracleやジャーナルログの辺りの設定ミスして トランザクションの途中でコケたりリカバリ失敗するのと、 最初からそういう概念のないシンプルなフリーDBMSやらDB2の方が マトモに動いていた、とか。
>>923 まだまだあるよ。
不採用の理由は?「タダだから」
真顔で言うんだぜ?
つーかさ、2行目以降は馬鹿なだけだろ、そういう奴は逆でもやらかす。
>不採用の理由は?「タダだから」 Javaが全否定ですか。 そーですか。 #別に金はらいたければ払えるけどな。
LAMP涙目w
>>923 そういう個別の問題はまた別の話だと思うが、もしそのトラブルが責任問題に
発展するとしたら、今度は「なんでちゃんとしたところに頼まなかった」とくる
可能性はありそうやね。
個人情報を管理するテーブルを作ろうと思っています。 個人情報を入れるテーブル名は personal。 学校は中学、高校、大学、大学院を格納するのに テーブルに personal.school1 〜 personal.school4 を作るのではなく、 school テーブルを用意したほうがいいですよね? school.personal_id と personal.school_id で JOIN させるような。 住所や電話番号、メールアドレスも複数、といっても最大 2 か 3 ですが、 これも正規化してテーブルを作るべきでしょうか?
要件次第なのだがw 個人的には両方無駄だと思う。 schoolテーブルにしていいのか、collegeとかhighschoolとかいうテーブルまで作るのか、 そこまでやっても、school側の管理が単に「出てくるだけ」なら意味がほとんどない。 メールアドレスも電話番号もたくさん持っている人に対応するためには必要な話かもしれないけど、 上限が概ね見えているならちょっとの予備だけでいいように思う。 と、思った。
>>930 なるほど。ありがとうございます。
単に書いて読んで、くらいですw
一つのテーブルに
email1
email2
tel1
tel2
address1
address2
school_name1
school_name2
school_name3
school_name4
という末尾に数字の付くカラムが多いので、
正規化するべきなのかな、と疑問に思ったのです。
現在は「中学、高校、大学、大学院」ですが、
そのうち大学院後の MBA や、大学院を複数回る人がいると
school_name5, school_name6 と増える可能性とか。
でも、school_name10 までいくことはないし、
とりあえず末尾に数字でやりたいと思います。
( プログラム側の CRUD 処理は一番楽ですし )
いやいや、こうだろ、というのがありましたら大歓迎ですw
schoolテーブルがあったほうがいいと思うけどな。
これ何? 俺俺詐欺用のデータベースでも作るのか? オープンソース使うと、無料で作れば良いだろうで無茶な仕様になりやすいけどな。ジャーナル機能みたいなの作ってとか、トランザクション機能も付けてとか。 オラクルとか商用ソフト使ってる分には、カスタマイズに成るのでお金が掛かりますで解決出来る。 javaはjavaそのものにはお金払ってる意識は無い。 Cやbasicやcobolに金払ってないのと同じ。有用なライブラリやフレームワークにお金出して、ちゃんと機能が使える担保を取ってるイメージ。 金無いなら、自分で全部ヤルしか無いけど、それは大変だろ。DBソフトを作るスキルは無くても、DBを作れて使いこなせれば十分。
どこまで正規化すべきか、なんて テーブルの具体的な使用方法やら想定件数やら求められるパフォーマンスやらがわからないと。 聞かれてもこちらには何も判断基準が無い。
普通のデータベースと言うか多くのRDBMSははフリーだろうとトランザクションやジャーナルは まずサポートしているが・・・。 と言うかそれがなきゃデータベースは名乗れないだろう。 つか本当にOracleやらPostgresやらDB2とか使ったことあるのか? あとzやiだとCやCOBOLは普通に金かかる。 iで金がかからんのはSQLくらいだ。
あと、同じ大学出身の人が100人いたら100回入力させてかまわないのか、 その際ある人は「ICU」ある人は「国際基督教大学」とか表記がバラバラでかまわないのか、とか。
>>936 学校名の変更があったときにどうすんの?とかね。
過去の卒業生も今の校名で出ちゃだめなら、マスタには日付が必要になるし。
だから「要件次第」としかw
oracleなんだが、前任者の残したDBがやべぇ。 テーブル数大小300以上、プライマリキーは全部ナンバリング。列名は英語の略語なのかローマ字の略なのか…何を示してるのかサッパリわからん。 テキストのメモ書き程度の説明書わたされたが既に実DBと合わない。 このDBをとりあえず自分が把握して、次の担当者にも優しい仕様にするにはどうしたらいい? 途方に暮れてる…
>>938 > 次の担当者にも優しい仕様にするにはどうしたらいい?
逃げ出そうってのかい?w
>>938 きちんとした引継ぎを行わなかったのがいけない。
前任者を捕まえてきて、まっとうな仕様書を書いてもらう。Q&Aも行う。
前任者を捕まえることができなかったら、引き継いだ人間と上司に事情を説明して、
DB解析のための十分な工数をもらう。
自分で再設計して、まともな設計のテーブルに移行だな。オラクル導入済みなのは幸い。 上司/決裁者に、現状を報告しておくのは悪くない。つーかにちゃんで相談よりもまずそっちだな。 指示が有ればその通りに動けば良いし、指示が無ければ、自分の遣りたいように提案して承認貰って動けば良い。 これから汗水垂らして綺麗にするdbをむざむざ次の担当者に譲ってやる事も無いと思うが。 前任者に習って、自分で仕様を抱え込んで飯にありついておくのが吉。多分そういうのが許される組織だろうし。
oracleはGUIが好きになれん。 なんでjavaなんて糞重いの使うの?
OracleはJavaにかなり貢いでいるから。 後はWindowsプラットフォームに動かす事にそんなに拘りないからじゃね。
VMWareにoracleぶちこむと重くて仕事にならない。
今どきあの程度のGUIが糞重いって、どんだけ極貧開発環境なんだ?
まだPIIIとか使ってるってだけでは。 時代はクアッド3GHzなのに。 エクリプスもJデベロパも殺人的に重いけどみんな使ってる。
948 :
938 :2009/07/16(木) 19:01:45 ID:???
データベースがデータベースで管理されてないなんて皮肉にもほどがある… 日付データ全部8桁のナンバで管理してる上に…20070735ってなんじゃこりゃあああ?!
>>947 起動時間は掛かるけど、起動してしまえばどうってことないな。
メモリは2Gはないと苦しいけど、CPUは1.5GHz〜(Pen4なら3GHz)あれば十分では?
>>948 2007年7月35日だ。わからんのかたわけが。
32以上は全部月末処理仕様
99999999で再起動するから入力しちゃらめぇ。
>>938 自分ならまずどのテーブルが活きてるのか見極めるかなあ…。
前任者一人で面倒見てたDBのテーブルが大小300って、それ絶対に半分は使ってないよ。
>>953 のレス見て思い出した。
Hoge、testHoge、testHoge2、testHoge3 ってテーブルがあってtestHoge2のみが生きてた所があった。
前任者「テーブル名の末尾Dは日次、Wは週次、Mは月次更新です」 俺「ふんふん。…あ、Tってのがあるんですけど」 前「溜め込みのTです。」 俺「(…終わった) そうですか…」 他にもRやNやJなんてのがあった。 Rは履歴、つまりバックアップらしい。 Nはノーマル。ただしノーマルでないものは存在しない。 Jは次期。いつの次期かは知らない。
別にいいんじゃね? センスはどうあれ一貫したルールが存在するなら。
よくねーだろw カオスすぎるだろw 溜め込みのTでくそわろたわ
これから綺麗にしていけば良い話。 コボラーとかまともな教育受けてない香具師がまともな設計出来る訳無いじゃん。
実際のところ、引き継ぎあるだけマシだよ
引き継ぎ無くても新しい自分の管理しやすい設計に変更していけば良いだけ。
>>960 仕様書も設計書もなく、複数の人間が複数回触り続けて全容が誰にもわからない、そんな糞システムを引継ぎもなく渡されたことないだろ?お気楽なコメントしてんなよw
1人プロジェクトしかやったことないんだろ
デスマ耐性無い香具師が多いな。自分で切り開けないと終わるよ。
なんで唐突にデスマの話になるんだろうな。
967 :
NAME IS NULL :2009/07/23(木) 17:27:05 ID:9uVZvB/4
例えば修理現場などで工程別に何を作業したか?というデータを収集したいとします。 そこでテーブル設計で悩んでいます。 追加/登録は、各マスタのデータ(工程等)をコンボボックス等で選択します。 案1より案2の方が優れていると思うんですが、如何でしょうか? また案2で重大な欠点がある場合は指摘していただけたらと思います。 ■案1 [データテーブル] ・ID(PK),工程ID(数値),作業ID(数値),担当ID(数値),作業日時(文字列),作業時間(文字列) [マスタ] ・工程ID(PK),工程名,順番,削除FG ・・・その他のマスタ ■案2 [データテーブル] ・ID(PK),工程名(文字列),作業名(文字列),担当名(文字列),作業日時(文字列),作業時間(文字列) [マスタ] ・工程名(PK),順番 ・・・その他のマスタ ===自分が思う利点欠点=== ■案1の利点 ・重複した名称のマスターデータが持てる。<=意味あるか? ・過去データを含めた名称の変更は、マスターを修正するだけでOK。 ・なんとなく連結される部分は文字列型よりも数値型の方がよさそう。 ■案1の欠点 ・データの表示には全てのマスターと連結したクエリーが必要<=フィールドが多いとめんどい上に遅くなる? ・マスターデータを完全に削除する事は出来ない。 また、過去データを変えずに名称を変える場合は新規にIDを追加する必要がある。 ・登録には必ず、マスタにデータを追加する必要がある。 ・登録したデータを修正したい場合、既に削除されたマスタがあった場合 コンボボックスにはどのように表示/登録させる? ■案2の利点 ・テーブルだけでデータの表示が可能。 ・マスタデータを削除する事が出来る。修正時も過去のデータを考慮する必要が無い。 ・IDを考慮する必要が無くなる。 ・登録するデータに汎用性がある(マスタに無いイレギュラーな登録も可能)。 ■案2の欠点 ・マスタに同名の項目が作れない。 ・データベースの基本としてなんとなくIDを利用したい。なんとなく見栄えが悪い。 ・工程名、作業名に利用できる文字が限定される。|\'# とか無理そう。
工程や作業をどうやってどこまで管理したいかによるだろう たとえば「組立て」と「組み立て」が別工程と判定されたら 重大な欠陥といえるかもしれないしそうでないかもしれない まず要件をしっかり見極めることが大事なんじゃないかね 利点欠点はその要件に対してメリットデメリットを判定しないと意味ないぞ まああげてる利点欠点も突っ込みどころ満載なんだがw
>登録するデータに汎用性がある(マスタに無いイレギュラーな登録も可能) とか言っても「順番」はマスタが持ってるんだけど、マスタに無い登録が可能でいいのか、とか。 外野には見えない「重大な欠陥」は有るかも知れない。
画像って今まではファイルパスだけ格納していたけど、 BLOB型使ってバイナリデータも格納しようかどうか迷ってる。
971 :
967 :2009/07/23(木) 21:46:25 ID:???
>>968 >工程や作業をどうやってどこまで管理したいかによるだろう
例えば10人の担当者が、20工程ある中から1つの工程で、30作業ある中から1つの作業をする。
作業をしたら、担当者(選択)、工程(選択)、作業(選択)、日時、時間を1台のPCへ入力する。
このデータは、後に修正、削除される可能性あり。
また、担当者、工程、作業のマスタの修正は1-3ヶ月に数回程度の頻度で発生する。
後に簡単に集計をしたいので「組立て」と「組み立て」などと同内容の
項目が別の文字で入力されるのは避けたい。
>まああげてる利点欠点も突っ込みどころ満載なんだがw
その満載な突っ込みどころを知りたいのだが。
>>969 マスタに無い登録が可能で良いのかどうか。は、確かに悩みどころです。
ただ頻度が極端に低く、担当者、工程、作業の中には期間限定の項目なども考えられるので、
あった方が良いかな?と思っています。
ちなみにマスタの順番は、工程の順番とかではなく、登録時にコンボボックスやリストで表示される順番に
なりますのでデータテーブルには関与しません。分かりづらくて申し訳ないです。
(コンボボックス等では選択しづらいとかは、論点ではないので無視してください。)
1-3カ月程度で工程や作業がコロコロ変わって かつマスタ側で管理したい項目は1つもない(単にコンボボックスの表示用)てことであれば 案2でいいんじゃないの。
>>971 似たような工程が別工程として登録されるのを防ぐなら、工程はマスタ化すべき
突っ込みどころは
>・重複した名称のマスターデータが持てる。<=意味あるか?
案2でも重複した名称で登録はできるが、なぜこれが利点なのだ?
>・なんとなく連結される部分は文字列型よりも数値型の方がよさそう。
なんとなくで利点だって言われても正しいかどうか判断つかんぞ
これにどうメリットがあると考えたんだ?パフォーマンスか?
そもそも示されてる範囲ではこれを文字で連結する要素は見当たらないが
>・マスタデータを削除する事が出来る。修正時も過去のデータを考慮する必要が無い。
そもそもマスタが存在してないが、修正時に過去データを考慮する必要があるかどうかは
要件によるだろ。今まで「組み立て」で登録してたのに、今後「組立て」で登録します
だけどこれは同一の工程です、となったら、過去に「組み立て」で登録してあるデータどうするのさ?
>・マスタに同名の項目が作れない。
そもそもマスタが存在してないが、同名の項目は入力できるだろ
同名だけど別工程だっていうなら、どっちにしろその違いを判定する項目が必要なことには変わらない
>・データベースの基本としてなんとなくIDを利用したい。なんとなく見栄えが悪い。
なんとなくでID使うとか言いだすともめるぞw
>・工程名、作業名に利用できる文字が限定される。|\'# とか無理そう。
そんなことはない。つか無理そうってだけで、無理かどうか確認もせずに欠点だって言われてもな
このぐらいでいいか?
あんまり再利用する事も無さそうだなあ。 かんばん方式的に作業時間短縮を狙うなら、そういうテーブルで管理したほうが素直な気がする。
皆さんどうもです。
>>972 マスタ側で、どういう管理が必要になったら案2では駄目になるか
もしポイントがあれば教えていただけますか?
>>973 >>・重複した名称のマスターデータが持てる。<=意味あるか?
>案2でも重複した名称で登録はできるが、なぜこれが利点なのだ?
案2では名称がPKになっている以上、マスタ側では重複した名称では
登録できないと思うのですが・・・。
>今まで「組み立て」で登録してたのに、今後「組立て」で登録します
>だけどこれは同一の工程です、となったら、過去に「組み立て」で登録してあ
>るデータどうするのさ?
その場合は過去の名称に意味を成さないと思いますので
データテーブルを一括置換します。
以下、そもそもマスタが存在していないとは・・・?
工程、作業、担当者 は各テーブルを作成してマスタ化している(と思っている)
のですが・・・。??
>>974 案2で再利用して困る場合はどんな時がありますかね。
>案2では名称がPKになっている以上、マスタ側では重複した名称では >登録できないと思うのですが・・・。 案2で工程名に対して制約つける気なのか? もしそうなら、案1と案2は、キーがIDか名称かの違いしかないぞ 登録できるってのは、あくまでデータに対しての話だ >以下、そもそもマスタが存在していないとは・・・? 存在してないってのはちょっとあれか マスタが存在しても、マスタに関係なくデータ登録できるなら マスタとしての意味はなしてないってことだ
977 :
NAME IS NULL :2009/07/25(土) 03:47:08 ID:DT7TRz8B
以下案2の欠点な。 ・VIEW上の工程名を一括で変えたいときに面倒。 SQL一撃だがunique indexのカラムが変わるので、multi versioning系でないDMBS だとほぼテーブルロック的挙動になるぞ。 ・工程名があんまり長いとindex leafに乗ってくるのがhash値になったりして 実表アクセスが増えて処理性能的に不利。 ・DBMS依存かもしれんが、左表NULL可だとNested Loopで結合できないから 結合時に性能的に不利になる。まあ、トランザクション少なそうではあるが。
イメージがまるでエクセルだ。 おそらくその程度のデータ数なんだろうな。 担当者がシートを開いて見渡せる程度。
>>967 工程名を変更した時点で工程マスタを参照しているテーブルのデータを修正しなければ行けない。
案2を捨てる理由はそれだけで十二分。
PKに意味を持たせるのは百害あって一理無し、初心者のうちはそういう太古からの慣習には黙って
従っておいたほうがいいよ。
「意味コード」という物の欠点を、ググルか先輩諸氏に聞いてみて。
もう一つ テーブル設計において「SQLでこう書くことになるから…」とか「こういうGUIの実装だから…」 などという事は考慮するべきじゃないよ。
性能面でSQLは考慮すべきだとは思うけどなあ。データベースエンジン依存だが。 GUIはユーザ依存なので要件きちんと把握しろとしか。
性能を考慮して元来は一つのテーブルにすべきところを分割したり、 正規化して分割すべきテーブルを一つにしたりってのは実際よくあるが DB設計って本来は性能を考慮するべきじゃないと思うんだがな それはSQLでもそうであって、性能を考慮してトリッキーなSQL書くべきではないと まあ、実際はある程度の性能は出さないと使い物にならないんだが 最近のマシンは早いし、オプティマイザも結構賢いので、よっぽど大規模じゃないと あんまり気にする必要ないかもしれん
O/Rマッパー使ってパフォーマンスが出ないからって正規化くずしを やってるとしたら本末転倒もいい所 でも意外にそんな開発現場が多い気がする。
>>981 「テーブル設計」なら正しいんじゃね?
「DB設計」の場合アクセスポイント(≒SQL)を意識する必要はあると思うけど。
>>983 んなとこあんのか?
正規化くずしなんぞせんでもインターフェース用意すれば済むだろ。