1 :
NAME IS NULL :
2006/12/19(火) 23:55:59 ID:hprRM4qH 語れ!!
2 :
NAME IS NULL :2006/12/20(水) 00:57:33 ID:4iqFdJvf
正規化って何で必要なの?特に必要ないように思うんだけど。
なんとなく、思うのは、 データの重複をさけたいからではないかと。
PKのないテーブルを設計する理由をおしえてほしい。 どんなときPKがいらないのか?
データの重複を避けると、データの管理が簡単になるだろ
>>4 めったに検索しないテーブルとか。
たとえば、なんかの動作ログ記録用のテーブル。
システムで使う定数を入れておく 1レコードだけのテーブルとか。
8 :
NAME IS NULL :2006/12/21(木) 14:58:42 ID:WlnR0fcq
あほくさい
>>8 どっちでもいいよ。どちらかが妥協すりゃすむし。
そんなんで工数伸ばすなよ。
コード化なんてDB設計の概念であるの? どの書籍読んでも出てこないんだけど?
それ以前の問題化と
>12 kwsk
顧客管理とか、売り上げ管理とか、給与計算とか、そろそろ定型パターンって決まって無いの? みんなでバラバラに作ってそれぞれ正規化してるのってかなり間抜け。 JISかなんかで、標準DB設計とか決めてしまえば良いのに。 SOX法対応ならこれとか、個人情報保護法対応ならこれとか、有ると楽。 DBAの仕事は無くなるだろうけど(w
その手の仕事したことないの? あんたが言うように定型パターンはあって、会社毎にちょっと手直しするレベル。 でも、その手の仕事でデータベース設計の比率なんて知れてるから、わざわざ標 準データベース設計から差分を設計しなおすぐらいなら、新規に作った方が早い し楽。 そもそも、標準からたいして離れていないなら、パッケージ製品導入するし。
標準データベース設計ってどこにあるの? パッケージ製品ってぼったくられるじゃん。
> 標準データベース設計ってどこにあるの? 日本語大丈夫か? そんなものいらないって書いてあるんだが。 > パッケージ製品ってぼったくられるじゃん。 頭悪いんだったら、金出せってこった。 て言うか、どっかに作らせたらもっとぼったくられるぞ。(w
業務別のパターン、結構本が出てるじゃん。 それ読みなよ。
ISBNくれ。
ISBN:457571075X
うまい
おまいら、DB設計で業務知識ってどのくらい意識してる?
DB設計というか、設計そのもので意識しないとだめくね?
>23 日経SWの記事で読んだ記憶があるんだが、 風呂屋のシステム開発で、業務知識を掴むため、 SEが一月ほど番台に立ったとかetc・・・
システム化された風呂屋...。 あんまり行きたくね〜な。
>>25 女湯にセキュリティホールがあるので安心です。
番台に上がる老人が居なくなるから、存亡の危機とかでしょ。
29 :
NAME IS NULL :2007/01/20(土) 10:27:38 ID:30yvgBBL
Firebirdで会社の作業日報を管理するものを作ろうとしてるんですが 平日と休日の作業時間を別々に集計したいのですが、 平日か休日かのデータをどのように管理するのがいいのでしょうか?
休日マスタ
休日しますた
32 :
NAME IS NULL :2007/02/02(金) 01:32:36 ID:FP7B9NgQ
3つのマスタテーブルがある場合に、それらをまとめて一つにした テーブルって作る意味ある? CREATE TABLE mst_hoge1 (id INT, name TEXT, PRIMARY KEY(id)); CREATE TABLE mst_hoge2 (id INT, name TEXT, PRIMARY KEY(id)); CREATE TABLE mst_hoge3 (id INT, name TEXT, PRIMARY KEY(id)); CREATE TABLE hoge_matome ( matome_id INT PRIMARY KEY, FOREIGN KEY (hoge1_id) REFERENCES mst_hoge1(id), FOREIGN KEY (hoge2_id) REFERENCES mst_hoge2(id), FOREIGN KEY (hoge3_id) REFERENCES mst_hoge3(id) ); matome_idを外部キーとして使うと全てのテーブルにhoge1_id, hoge2_id, hoge3_id が入らなくて楽なんだけど。
まずマスタテーブルが3つもある理由から聞こうか。
34 :
32 :2007/02/03(土) 13:49:09 ID:???
顧客マスタ、商品マスタ、配送業者マスタと3つあって この3つセットが複数のテーブルで外部キーとなっている。 外部キーがいつも3つセットで登場するので、1つにできたら 全体的にテーブルもすっきりするかな、と思った。
35 :
32 :2007/02/03(土) 15:21:16 ID:???
もうちょい具体的に書く。 CREATE TABLE 受注伝票テーブル ( 受注ID INT PRIMARY KEY, 顧客ID INT, 商品ID INT, 配送業者ID INT, 受付日付 DATE, 処理日付 DATE, 担当者 TEXT, FOREIGN KEY (顧客ID) REFERENCES 顧客マスタ(ID), FOREIGN KEY (商品ID) REFERENCES 商品マスタ(ID), FOREIGN KEY (配送業者ID) REFERENCES 配送業者マスタ(ID) ) とこんなテーブルがあって、例えばこのテーブルと1:n関係にあるテーブルには 外部キーのリレーションによって FOREIGN KEY (顧客ID) REFERENCES 顧客マスタ(ID), FOREIGN KEY (商品ID) REFERENCES 商品マスタ(ID), FOREIGN KEY (配送業者ID) REFERENCES 配送業者マスタ(ID) をいちいち入れないといけない。これが嫌なので CREATE TABLE 流通テーブル ( 流通ID INT PRIMARY KEY, 顧客ID INT, 商品ID INT, 配送業者ID INT FOREIGN KEY (顧客ID) REFERENCES 顧客マスタ(ID), FOREIGN KEY (商品ID) REFERENCES 商品マスタ(ID), FOREIGN KEY (配送業者ID) REFERENCES 配送業者マスタ(ID) ) とこんな外部キーだけをまとめたテーブルを別に作って、 CREATE TABLE 受注伝票テーブル ( 受注ID INT PRIMARY KEY, 流通ID INT, 受付日付 DATE, 処理日付 DATE, 担当者 TEXT, FOREIGN KEY (流通ID) REFERENCES 流通テーブル(ID) ) と外部キーを一つにすると、1:n関係にあるテーブルにはキーが1個で済むので 容量的にも速度的にもよさそうなもんなんだけど、設計としてはどうなの?と 思ってる。
その場合、3つのマスタを組み合わせで商品データが作成されるということではないかと思う。 運用方法にもよるが、よく使う手だよ。 ただし、流通IDで受注入力を行うのなら問題はないが、 入力時に顧客マスタ、商品マスタ、配送業者マスタを 別々に絞込みを行い入力する場合は手間も時間もかかるね。 運用しだいだね
37 :
32 :2007/02/03(土) 22:05:19 ID:???
>>36 運用では流通IDでのみ受注入力なので問題がないようです。
ありがとうございました。
初DB作成で商品評価データベースを作りたいと考えています。 流れ 1webでユーザー登録(未登録はゲスト) 2ユーザーは商品に評価・感想を書ける 3それら評価などから商品をランキング表示可能 といった感じなんですが ・商品データベース ・ユーザーデータベース の2種類が必要そうだなと。こういった場合ユーザーの 「評価」や「感想」はユーザーデータベース側か 商品データベース側かどちらに置いておくほうがいいとか あるんでしょうか? 基本設計のアドバイスをいただけたら幸いです。
設計の基本 1. エンティティを決める 2. 1:1, 1:n, m:nの関係を整理してリレーションを決める。 私の場合なら、エンティティとして ・商品 ・ユーザ ・評価 の3種類作るな。 商品と評価の関係: 1:n 1個の商品に対してn個の評価の可能性があるので1:n関係。 ユーザと評価の関係: 1:n 1人のユーザがn個の評価をする可能性があるので1:n関係。 n側の方に1側のプライマリキーを含めると評価テーブル完成。 1:1, m:nは設計という意味ではあまり意味ないので無視する。 ランキングについてはちょっと考えてみ。
40 :
NAME IS NULL :2007/02/17(土) 18:52:52 ID:JVcoRVj9
DB設計していると区分が大量にでてくるけど、 そういうのって、区分を管理するテーブルを新たに作って管理するものなのかな?
必要なら作れ
42 :
NAME IS NULL :2007/02/17(土) 21:20:37 ID:JVcoRVj9
>>41 あなたはどう管理していますか?
プログラム、それともテーブルで管理していますか?
私は、テーブルや、項目を管理するテーブルを作って、
下のような区分管理テーブルを作っています。
テーブルコード pk
項目C pk
区分 pk
区分名称
汎用性持たせとくか、決め打ちかってだけじゃないの? 速度重視なら決め打ち。 拡張性重視なら管理テーブル作成。 システム屋の場合は定期的に収入も欲しいから、あんまり完璧なシステム作ると仕事が無くなる。 定期的に手直ししつつ収入が入って飯が喰えたほうが嬉しい。
44 :
NAME IS NULL :2007/02/23(金) 23:26:01 ID:1tyqb/0g
これまでの業務で外部キーを使うことってあまりないのだが、 外部キーって必要な場面ってどんなとき? 外部キーで可能な制御は外部キー制約で制御する事じゃないと思うのだが。 プログラムレベルで制御すべき事が多いと思う。 テストデータ作る時なんか、 外部キー制約で挿入が面倒だというデメリットは知ってるが。
46 :
NAME IS NULL :2007/02/24(土) 00:32:27 ID:7O++I76A
>>44 伝票ヘッダーと明細の関係の時に使うよ。
伝票消すときはヘッダーだけ消せばいいから
47 :
NAME IS NULL :2007/02/24(土) 14:09:22 ID:+wKoEvab
くだらない質問かもしれないんですけど カラムの命名でちょっと迷ってます。 色々なテーブルで同じ種類の項目、 例えばテーブルuserとshopに名前をあらわすカラムを作るとして これを両方ともnameと命名するのと、user_nameとshop_nameなどユニークな名前で 命名するのとどっちがいいのでしょうか? SQL的にはテーブル名指定しなくていいし、例えば登録日時でソート なんてする場合、全テーブルadd_dateなんて名前にしといたら joinして問い合わせたとき、必ずテーブル名をつけなきゃならないじゃないですか?(ここ間違ってます?^^;) とりあえず、ユニークな名前をつけようと思ってるのですが どうなんでしょうか? ご意見ありましたらよろしくお願いします。
>>47 nameだと迷うかもしれないが
主キーとかはuser_idとかshop_idにしないと
両方とも他のテーブルのFKになった時に
結局名前付けなきゃならなくなるのでそうしてる。
idをそうしたんならnameもあわせてそうしておく方が
判りやすいと思う。
とここまで書いて気が付いたが、addressやらtelやらemailは
user_とかshop_とかつけないなあ・・・なんだろうこの基準は。
気分でしかないのかも知れないなあ。
登録日時なんかは要するにメンテ要件であって
業務要件ではないので全部同じ名前にしてる。
49 :
NAME IS NULL :2007/02/24(土) 19:30:30 ID:7O++I76A
主キーは普通IDじゃないとORマッパー使うとき不便だぞ
50 :
NAME IS NULL :2007/02/24(土) 21:19:20 ID:w75Pe+VJ
>>47 名前を表すといっても店名と人名は違うだろ?
だから別のカラム名の方がいい。
電話番号、メールはどちらも一緒だから、
同じ名前にしないと分かりづらい。
この辺は国語の問題なんだけどな。勉強してきてないヤツ(専門卒とか)が悩む問題だね。
>>50 名前を表すといっても店名と人名は違うだろ?
って当然のようにいってるけどさ、
店名・人名の違いって何?
もっと仕事ぽくいいかえようか?
仕入先マスタと売上先マスタがあったとして、
仕入先名と売上先名の違いって何?
>>50 面倒だからいっそ同じ名前(cd,name,telとか)にしてasで別名付ければ良くない?
使い回しするのはview作るんだろうし。
54 :
NAME IS NULL :2007/02/24(土) 22:26:37 ID:7O++I76A
>>52 売上先マスタって・・・
後気持ちは分かるけど
ちょっとずれてるぞ
普通、得意先名と店名は意味合いが違うだろ
>>54 取引先として一括管理したい場合があるって事じゃね?
JAなんかだとコードも一緒だったりするんで別管理しなくて良くね?って話が出た事がある。
(こっちのシステムの都合で別マスタになったが)
56 :
NAME IS NULL :2007/02/24(土) 22:35:35 ID:EBk8cf2k
ユーザー自動作成の日別スケジュール表で、 何のイベント(予定記入)もなく過ぎ去った過去の日のレコードは 削除した方がいいですか? 何らかの追加があった場合にはレコードを新規に追加するようにして
57 :
NAME IS NULL :2007/02/24(土) 22:36:49 ID:7O++I76A
なら仕入先マスタはいらないじゃん
58 :
47 :2007/02/25(日) 01:07:30 ID:Zz8YGbzC
>>48 >>50 他、関連レスしてくれた人サンクス
確かにFKは迷わずユニークですね。
うちの会社のシステム(外注品)は
>>47 と同じ感じの仕様なんですよね。
で、会社では、データを取り出すプログラムを作ってるんですけど、
登録日時順にソートすることが多いんです。
また、会社のシステムには全テーブルにadd_dateというカラムがあって、
これ名前変えた方が迷わなくて良いのかなあ
なんて考えたわけでして・・・
今、仕事とは別に自宅鯖で個人的にシステムを作っていて、
いっそのこと、カラム名は全テーブルでユニークな名前にしたらどうだろうと思い
ちょっと迷ったので質問しました。
参考にさせて頂きます
ありがとでした。
結局お客さんによりけりじゃないの? もう理屈こねたって宗教論争ぽいよ。 お客さんの店台帳に「店名」って書いてあれば shop_nameとするのが自然だし ただ「名称」と書いてあったら、 nameでもいいけど、うーんでもちょっと迷うな。 で、台帳には普通「住所」とか「電話番号」って書いあるだろうし だからそれらはaddressやらtelでいい、と。 もし「店住所」とか「店電話番号」って書いてあるなら shop_addressとかshop_telとか考えればいい。まあまずないよなあ。 idはユニークな名前の方がいい。 「id」って名前にしないと使えないORマッパなんてもんが あるならそんなもん使わない方がいいよ。
60 :
NAME IS NULL :2007/02/25(日) 11:30:30 ID:k357gTV0
複合キーを受け入れられない人っているんだね〜(w
61 :
NAME IS NULL :2007/02/25(日) 13:58:00 ID:6/IGUhkO
一つ間違って欲しくないのはSQLを書きやすくするためのテーブル設計をしてはだめ。 CUSTOMERS.NAMEが得意先名の方が自然だろ。 得意先名というのは得意先の名前であって得意先の得意先名ではない。 CUSTOMERS.CUSTOMER_NAMEだとおかしいし、それはむかしのテーブル設計方法だ。 少なくともJAVAやRAILSとかではこれが主流。
>>59 その例じゃ・・・
携帯TEL・自宅TEL・会社TELとかの方がいいだろ
>>61 テーブル設計ってより名前付けのポリシーだからなあ
どうしても悩んじゃうんじゃないかな。
SQLを書きやすいように設計するなってのは
要するに、実装の都合で設計を左右させるなって事だと思うけど
そうすると最後のJavaやRailsとかでは主流、なんて話と矛盾するじゃん。
言語の都合に合わせてよくてSQLの都合に合わせちゃいけないってのは
その間にどういう違いがあるのかな?
>>62 うん、だからお客さんの台帳にそう書いてあるなら
そうしなよって話だよ。
>>61 上の議論が単にSQLの書きやすさを云々しているのだと思っているなら
オマイが間違っている。
RDBの世界のこの古い慣習は、同一のドメインを持つ属性には
同じ属性名を使おうということ。
ちなみにJava言語そのものはこれをクラスで表現できるわけだけど、
ドメインを意識した設計をするJavaプログラマーてのは少ないね。
まぁいちいちクラスを起こすのは面倒くさいってのもあるけれど。
65 :
NAME IS NULL :2007/02/25(日) 15:46:27 ID:6/IGUhkO
そういうレベルの低い設計方法を話し合うスレなの? IDEFとかの勉強をしたら?
>>64 そうか、ドメインだ、その言葉ですっきりした。
>>52 はさ、電話番号、住所は同じドメインで
店名と人名はドメインが違うと言ってる訳だよ。
で、店名と人名と、どう違うのよ?
それぞれのドメインってどんなもんなのよって
話だよな。
ただの名前付けの話からスレタイにふさわしい内容になってきたなあ。
で、話が前後するけど、実装と設計の話だったら俺は
実装の都合に合わせた設計はしてもいいと思うよ。
実装されない設計なんて意味ないし。
ORマッパーが複合キーだと使いにくいってんなら
全部id振ります。
68 :
67 :2007/02/25(日) 17:10:21 ID:???
ごめん。
>
>>52 はさ、電話番号、住所は同じドメインで
> 店名と人名はドメインが違うと言ってる訳だよ。
これは
>>52 じゃなくて
>>50 の間違い。
69 :
NAME IS NULL :2007/02/25(日) 19:17:19 ID:6/IGUhkO
>>64 上のレスはドメインモデル無視にSQLの書きやすさとかユーザーが扱う項目名を安易にカラム名に使用してるように思えた。
ながれてきに解決したみたいだからいいけど
>>56 > ユーザー自動作成の日別スケジュール表
俺俺用語で書かれても、君以外には理解できないよ。
SHOP.SHOP_IDと記述する私は昔の人だと感じました
OOのドメインモデルとRDBのドメインの区別ついてるか?
通りすがりで酔ってるので、スーパー亀レス
>>2 正規化する必要性は、
「1事実1箇所(one fact in one place)」にすることで、
データ操作時に発生する問題を解消する。
(発生する問題)
・二重登録/重複更新(更新不整合)
・事前登録できない(挿入不整合)
・関係の消失(削除不整合)
>>4 テーブルに1行しかないとき。
RDBにおいて、主キーはテーブルのなかから行を特定するためのものだから。
1行しかないので特定する必要がない。従って、主キーが不要。
>>11 コード化は、DB設計の概念ではない。でも広義にはドメインの設計と言えるかも。
>>22 「DB設計」という用語が、データ設計、概念設計などと同義であれば、
業務知識が必要。物理設計と同義であれば、不要。
>>32 ,35
[流通テーブル]は、「連関エンティティ」というものにあたるな。
さらに、[流通ID]は、「代替キー」というものにあたる。
厳密には、[顧客ID,商品ID,配送業者ID]でユニーク制約を実装する必要がある。
(もともとその3つが主キーとして一意性があるから)
ちなみに「リレーション」じゃなくて「リレーションシップ」だ。
「リレーション」はRDBではテーブルのことだ。
>>40 自分の場合は、その区分がデータモデル上のエンティティとして意味を持つか、
その区分のドメイン(=定義域=値のとりうる範囲)に変更がありそうなら
テーブル作るかな。変更可能性が少ない場合は、特にテーブルにしない。
>>44 参照整合性制約(外部キー制約)は、データ中心設計した場合に必要だと認識してる。
可能な限り、データモデルを実装に反映することで
・設計-実装の乖離を防止する
・正規化されたストアをAP屋が解釈するというスキルミスマッチを防止して
開発コストを適正にする
・どうせ商用DBつかうから、自前APで制御のテストコスト掛けるより安くすむ
自分は、そういう解釈をしてDBで実装してる。
業務知識もうろ覚え、データベース設計もろくにやったことが無い素人に基幹の DBを設計させんなよ('A` xxxはpkにした方がいいんかなぁ・・・ あ、でも帳票の括りを考えると属性のほうがいいかなぁ・・・ 待てよ、入力単位を考えたらこれじゃ駄目じゃん 先頭へ戻る て感じで延々とループに陥ってる漏れ orz ところでERWinって半額くらいで買えるキャンペーンとかないん?
76 :
NAME IS NULL :2007/03/23(金) 11:38:15 ID:HPT+SY9e
> ところでERWinって半額くらいで買えるキャンペーンとかないん? Visio じゃ駄目なの?
> ところでERWinって半額くらいで買えるキャンペーンとかないん? 紙と鉛筆じゃ駄目なの?
>>76 ERWinの快適さに慣れると、VisioやObjectBrowserには戻れンすよ。
んでも、DBDesigner4を試してみたら思ったよりイケテる感じがしたんで
しばらく試してみようと思う。
>>77 m9(^Д^)
ERWinは保守ツールだな。設計の後半から保守フェーズ向き。 設計の前半は紙と鉛筆、客向けの資料はVisioも使うぞ。
>>78 DBD4って辞書登録出来るん?
なんかどうやって項目を辞書登録していいんかわからへんかったやねんけど。
82 :
NAME IS NULL :2007/06/10(日) 19:34:15 ID:NrCzcrMI
今のシステムのOracleデータベース、新機種が発売されるたびに、その機種専用のスペックテーブルが増えたり、 関連するテーブルのフィールドが増え、そのたびに増えたテーブルやフィールド用にプログラムをバージョンアップするんだが、 そもそも機種が増えるたびにデータベースの構造を変化させるようなテーブル設計ておかしくない? それとも、世の中では普通に運用中にテーブル増やしたりフィールド増やしたりするの? 異動して半年、あまりの設計思想の違いに混乱しまくりです。。。
余計なことして、仕事 (した気になってる) or (してる振りしたい) 奴がいるんじゃないか?
テーブル生成SQLなんて、Excelでええやん。
85 :
NAME IS NULL :2007/06/13(水) 18:07:38 ID:i/W8/Jf6
お前が管理者になって自分の部署がシゴトナシになった場合のやばさを考えるんだ
いくらでもFreeでいいツール出てきてんのにEXCELって、酷いよね・・・
>>82 その設計はおかしいんじゃない。
コボラーとかVB厨房の設計じゃないのかな。
>>82 たしかに新機種が発売されるとテーブルが増えるという
設計はおかしいな。
カラムが増える、というのであればわからんでもないが。
現時点では実装されていない「機能」が将来つくかもしれんしね。
>>88 むしろ新機種の新機能部分は新規テーブルで作ってリンクという思想自体はアリでは?
例えば携帯電話みたいに
新機種毎に新機能+それに関わる多数の独自の属性項目がどんどん増えていくような
商品の場合
# カメラ機能テーブルとかワンセグ機能テーブルとか。
旧製品は新機能のテーブルにレコード自体が存在しないから無駄も少ないし。
新製品毎に既存のテーブルの列が増える方が問題な気が。
旧製品にとっては確実に無駄な項目だから。
90 :
NAME IS NULL :2007/06/25(月) 10:17:22 ID:NcBbc/LF
それならいっそ 機種ID 機能ID スペック(数値型) スペック(文字列型) 機能ID 機能名 みたいな設計にしてみるとどうだろう。
91 :
NAME IS NULL :2007/07/05(木) 19:32:01 ID:iUW9TYQf
質問です。 例えば、以下のような項目があった場合の設計に関してです。 (前提条件として各データが複数になる事はありません。) 個人ID/名前/住所/電話番号/性別/身長/体重/胸囲/腹筋/背筋/腕立て/ 上記の様に一つのテーブルでも問題ありませんが、分類すれば、 ■基本情報 個人ID/名前/住所/電話番号/性別/ ■身体 個人ID/身長/体重/胸囲/ ■能力 個人ID/腹筋/背筋/腕立て/ と、意味で分類できる場合、1対1の関係のテーブルを作った方が良いのか悪いのか。 って事なんですが。 分かれていると手間になるが、分類してある方がすっきりしているような気もするし・・・。
>>86 社内規定でフリーソフト使用禁止なんだ……。
93 :
NAME IS NULL :2007/07/05(木) 23:41:16 ID:BUGp8zxh
>>91 分類したあと、分析とかするの?
基本的には、ひとつで問題ない。第3正規形を満たしてるし。
(でも、前提条件あるとはいえ、年度によって身長とか変わると思うけど…)
94 :
NAME IS NULL :2007/07/06(金) 00:03:10 ID:7xm44r2b
>>91 情報のライフサイクルで分けるといいと思う。
測定が複数回行われたり、行われない場合もある(NULLが発生する)のであれば
■基本情報
個人ID/名前/住所/電話番号/性別/
■身体測定
身体測定ID/個人ID[FK]/実施年月日/身長/体重/胸囲/
■能力測定
能力測定ID/個人ID[FK]/実施年月日/腹筋/背筋/腕立て/
のようにする方がよい。
逆に個人情報の登録時に必ず1回だけ測定が行われるのなら、意味のないテーブル分割はしない方がいい。
>>91 分ける意味も必要もないと思う。
理由は、前の人も書いているけど、前提条件から個人IDが主キーだとして、
非キー属性が主キー属性に関数従属する第3正規形になっていて、
多値従属性や結合従属性などの従属関係が無い。(これ以上正規化できない)
要するに正規化済みなので、テーブルを分割する必要は無い。
one fact in one place(1事実1箇所)で。
また、ERモデルで考えた場合に、前提条件から"個人"=個人IDとした場合、
"個人"という【実体】を表していて、エンティティを3つに分割できない。
>>91 無理やりにでも分ける意義を見出すならば、
各情報へのアクセス権限を管理したいケースかな。
職員は全てへのアクセス権限があるが、保険委員は
身体/能力にしかアクセスさせたくないようなシナリオ。
もちろん、フィールドごとに権限を管理できるDBMSならば
1テーブルでもそれは実現できるという話になる。
>>93-96 ありがとう御座います。
1対1になる場合は、原則分割する意味は無さそうですね。
そして申し訳ありません。
>>94 さんの回答を頂いて自分の失念がありました。
前提条件に関してですが、
前提条件として各データが複数になる事はありません。
これに追加して、ただし、身体測定と能力測定は、測定しない人もいます。
(身体測定だけする人、能力測定だけする人がいます。)
がありました。
この場合、分割するとデータは1対1か1対0の可能性がありますので、
分割する意味はあるという事になりますでしょうか?
それともやはり無いのでしょうか。
>>97 扱ってる人数が非常に多く、なおかつ測定している人が非常に少ない場合は、
「測定した人だけを対象に」何かを集計するようなクエリでは
各テーブルに分けている方がパフォーマンス的には有利にはなるかな。
あと、ディスクサイズの節約にもなる。
逆に言えば、測定値がN/Aの人がほとんどいないならば
1テーブルでいいだろう。
ちょうど今のDB設計でそんな状態があったから書き込んでみる。 俺が1対1にテーブルを分けるのはイベントタイミングが分かれる場合と、 業務的に敢えて意味を持たせたい場合かな。 たとえば登録するユースケースが複数に分かれる場合などね。 ・基本情報登録UC ・身体情報登録UC どっちもInsertになるしわかりやすいから実装しやすい。 1度に取ってくる場合には結合が発生する分無駄になる。 1テーブルにしてしまうと1回目はInsert、2回目はUpdateになるから、設計が面倒になるし。 あとは、ORマッピングするときも分けておいたほうが楽。 クラス設計だとその2つは「人」と「身体測定結果」の2クラスに分けるから。 もっとも、「測定項目」と「測定結果(値、単位、測定年月日)」とかにしとくとさらに汎用的だよね。 DOAじゃなくてスマソ
100げっと
>>99 なるほどそれなら2テーブルに分けてinsertがやりやすそうだけど、
データの扱い方が、マスタというよりはログ的な場合だよね。
重複登録されても、そのイベントの時点では許容して、
レポートを出す段階になったときに考慮するような感じの。
> 1テーブルにしてしまうと1回目はInsert、2回目はUpdateになるから、設計が面倒になるし。 意味わからん。 データの修正は金輪際ないって仕様なの? それとも、全部 Insert しといて、参照する時は最新のものを取ってくるとか?
>>99 >クラス設計だとその2つは「人」と「身体測定結果」の2クラスに分けるから
これなら分割する意味有るね。
初心者です。質問させてください。 時間を扱うのはどの型で決めればいいと思いますか? 時間といいますと、一時間や二時間とかで日付、時刻ではないです。
int
tinyint〜int で良いんじゃないか。 どういった点で悩んでいるの?
>>103 nvarcharなら1時間でも一時間でも壱時間でも丑三時でもオッケーだぜ。
107 :
103 :2007/08/08(水) 08:53:20 ID:???
レスありがとうございます! 時間の計算がしたくてどのような値がいいのか、他の同僚がTime型で定義しようなど言っていたのでそれでいいのかということが聞きたかったのです。 Time型って時刻ですよね?時間といえば時間なんですけど・・・ 疑問に沸いたのでみなさんはどの型を使用されてるのかお聞きしたくて書き込みました。 intで定義されている方の場合1時間30分はどのようなデータになるのでしょうか?分計算で90という値が入る形ですか?
108 :
NAME IS NULL :2007/08/08(水) 09:10:20 ID:aWfaidbN
「時刻(位置)」と「時間(距離)」は別物。 そして分単位が必要となるなら、分単位で保持しておくこと。
109 :
103 :2007/08/08(水) 10:12:46 ID:???
>>108 別物ですよね。ならばTime型はやめた方がいいということですよね?
DBの設計者も今回設計はじめてらしくTime型を選んだのはテーブルのデータが見やすいだからだそうです。
Time型のばあい1時間であらわすと 01:00:00 と入れるらしいです。確かに分かりやすいですが・・・
その辺についてはどうでしょうか?そのデータ内容は24時間越えないそうですがDB設計としては間違っていませんか?
>>109 そのTime型というのが、使用してるDBMSで、時刻ではなく時間長を表す型として
用意されてるものなら、それが一番いいんじゃない?
質問者がDBMSを明示してないし、ここのスレの回答者は基本的に
DBMS非依存の標準SQL仕様を前提に考えてるから汎用的には
>>104-106 ,108 みたいな回答しかない出せないわけだが(もちろんそれが正しい)、
DBMS依存を考慮するならまた話は変わってくる。
111 :
103 :2007/08/08(水) 11:06:43 ID:???
>>110 勉強になります。Time型など時間は時間長として扱うということに抵抗があったので(><)
DBMSはpostgresを採用してます。
>>111 PostgreSQLなら、時間長はinterval型てのが用意されてるみたいだね。
俺も使ったことはないから自信もって推奨はできんが。
PostgreSQL識者いたら、フォローよろ。
あと、回答者もPosgreSQLマニュアル読んでみて。
114 :
103 :2007/08/08(水) 12:10:20 ID:???
みなさんご親切にいろいろありがとうございます!
>>112 interval型ですね。調べてみます!
115 :
NAME IS NULL :2007/08/08(水) 13:58:43 ID:aWfaidbN
interval型とか、ホスト言語から扱いにくかったりもするから注意。
116 :
103 :2007/08/08(水) 16:43:16 ID:???
>>115 javaを扱ってますがたしかにそのような感じですね。
基本的に"時間"だからtimeだのtimestampをつかうのはおすすめしない。 時と場合による。書き込みをみてると単純にTime型をあなたが使いたくないだけに見える。 その保持した分の使用用途にもよる。
118 :
NAME IS NULL :2007/08/12(日) 14:11:04 ID:N4Usbcud
ユーザーに好きな食べ物を選ばせます。 1.肉 2.魚 3.野菜 1個も選ばなくてもいいし、2,3個選んでもいいとします。 こういった状態を保持するのに 1) それぞれ専用の列を用意して好き・嫌いを保持する 2) 好きな食べ物列を用意してパーミッションみたいに1,2,4みたいな感じで保持する 3) 好きな食べ物列を用意してカンマ区切りで保持する 1だと選ばせる食べ物が増えた場合にたいへんそうだとか、ぱっと思いつくのですが なにぶん経験不足な物で、どのパターンでやると今後こまったりするのか、などが調査できていません。 どのパターンがよいか、またこういった時にこまる、など教えていただけないでしょうか。
119 :
NAME IS NULL :2007/08/12(日) 15:12:05 ID:SxglpIS4
■ユーザー ユーザーID/名前/etc... ■食べ物 食べ物ID/名前/etc... ■ユーザーの好きな食べ物 ユーザーの好きな食べ物ID/ユーザーID(FK)/食べ物ID(FK) とするのがよいと思います。
>>118 一般に、多対多の関係は「関係」を表すテーブルを作成して表現する。
つまり答えは
>>119 の通り。
「ユーザーの好きな食べ物ID」は余計だけども。
>>120 「ユーザーの好きな食べ物ID」は
実装を考えた場合あった方がいい。
実装で複合キーはやっぱりしんどい。
>>120-121 IDを付加するか否かの基準を教えてください。必ず必要ということなら、
その理由を。
私は、重複する可能性のないものはIDは要らないと思っていました。
この例ですと、ユーザーIDだけが必要だと。
123 :
122 :2007/08/14(火) 12:08:01 ID:???
>>122 ネタっぽく書いたつもりでしたが、おかしかったですね。
この書き込みなかったことにしてください。
>>122 そもそも「ID」というものはプログラム実装上の都合でつけるもの。
IDをつけたほうが実装しやすければつければいいし
そうでもなければつけなければいいだけ。
いちいち考えるのが面倒だから全部IDつけちゃえっていう考え方もアリだろう。
125 :
119 :2007/08/14(火) 13:11:37 ID:fI74lPjs
私はまさに、実装に便利なのと、いちいち考えるくらいなら主キーは全部IDにしてしまえと思っています。 デメリットもないですし。
126 :
NAME IS NULL :2007/08/14(火) 13:17:22 ID:vLfyd2Go
DB 設計の話かどうかわからんのですが… 必要なディスク容量とかどのように算出するものなのでしょうか? 例えば、レコードに以下のデータを保存するとして、 id: 4 Byte name: 64 Byte jender: 1 Byte memo: 256 Byte 合計が 325 Byte になります。レコードが 100000 件あるとすると、 最低でも 325 * 100000 = 32500000 Byte になり、 圧縮されずに保管されるとして、ディスク領域として最低 30MB ほど が必要になるのではと想像しています。 しかし、管理用にとか、検索用にとかでこれだけでは足りないとも 思っています。 一般的に必要なディスク容量を出すときは、 どのように見積もるものなんでしょうか?
>>126 MySQLはよく知らないから大雑把な話をすると、方法は次の3つくらい。
1) 1レコードのバイト長Xレコード数で求めたものを3〜4倍する。
2) 実際にテーブルや索引を作り、実際のレコード数または1/倍のレコードを投入して測定。
3) DBMS毎に細かい計算方法がマニュアルにあるのでそれで積算する。
3が一見一番緻密であるため正確のように思えるが緻密ゆえに誤差や誤謬で大きく外れた数字になりやすい。
1と2を組みあわせるのが一般的。
ただ客から3を要求されることは多いので、3の数字が妥当であるかの検証に1や2の結果を利用することになる。
128 :
126 :2007/08/14(火) 14:15:19 ID:vLfyd2Go
>>127 なるほど、そのような方法を取るのですね。
1 は本当の概算、2 は(ある意味)実測値、3 は計算で出す。
このような方法を取るわけですね。
参考になりました。
ありがとうございました。
>>126 そん時に入手可能なそこそこの金額のHDDにしておくので考えた事ない。
本格的にDB(MySQL)を使ってサイトを再構成しようかと考えています。 サイト内容はいわゆる会員制サイトなのですが、構成を考えているうちに疑問な点が あるので質問させてください。 質問: リレーションシップが無いテーブルは別のDBに分けたほうが良いのでしょうか? 具体的にいいますと「会員情報」と「ログイン認証用(※)」テーブルの2つなのです。 「人間」的にはどちらも同じ会員が使用するテーブルなのですが、 「コンピュータ」的には「会員情報」テーブルはそれほどやり取りが多くない静的なテーブルで、 「ログイン認証用」テーブルは会員ページにアクセスするたび呼び出される動的なテーブルに なると思います。 セキュリティ、パフォーマンスの面からご指導いただけるとありがたいと思います。 (※)セキュリティの為、ログイン時にcookieに「ID+ランダムな文字列」という情報を持たせています。 それをログイン認証用テーブルで参照します。
リレーションシップがないからって別DBにしてたら別DBだらけになっちゃうよ。 セキュリティ、パフォーマンスを気にするにしてもDBを分けるという解に行き着くのは 相当なレアケースだと思う。 (特定のテーブルをEUC的に開放するようなケースしか思いつかない。)
DBを分けるかどうかは、物理設計/運用設計上の問題だね、基本的には。 特にOracleの場合は、1DB=1インスタンスだから、DBを分けるということはインスタンスを分けるということになるので、 リソースの使用量が増えることになる。
いや1インスタンスで複数DB作れたよ。
それは勘違い。
あらそうなの? 同一インスタンス内で、 データベースリンク張ったりしたんだけど。 あれはデータベース同士のリンクって意味じゃないのか。 なんていうの?スキーマ?なら勘違いスマン。
Oraclerは大概インスタンスとデータベースをごっちゃにするよね(藁
Oraclerは大概データベースとスキーマをもごっちゃごちゃにするよね(藁々
138 :
135 :2007/08/20(月) 17:15:56 ID:???
>>137 つまりそれが俺なわけだな。
つかオラクラーじゃないから勘違いしてるわけでして・・・。
あやまるからもういじめないで〜
データベースリンクって言われたら
データベースとデータベースをリンクしてんのかと思うじゃん・・・。
139 :
130 :2007/08/20(月) 23:19:53 ID:???
たくさんのレスありがとうございます。m(_ _)m
>>132 さんも書かれたとおり、
「ログイン認証用」のテーブルを持っているマシンには負荷がかかると思い、
将来的にはパワーのある別サーバを用意してそちらに置こうかと考えていました。
当面はDBサーバを一台で運用できると思いますが、とりあえず両方試してみます。
>>135 オラクルのデータベースリンクは、分散システムの位置透過性を実現する機能。
なので、データベース同士のリンクって意味であってる。
また、1インスタンス=1データベースが正しい。
ちなみに、オラクルでいうインスタンスとは、DBMSプロセス+メモリ領域のこと。
データベースを構成するデータファイル群は含まない。
そして通常は、1インスタンス+データファイル群=1データベースと呼んでる。
(複数インスタンス+複数データファイル群=1データベースもある=RAC)
同一インスタンス内?(同一データベース内?)でデータベースリンクを張れるけど、
それは本来のデータベースリンクの使い方じゃない。(無駄なだけ)
141 :
135 :2007/08/26(日) 01:43:26 ID:???
>>140 わかりました。
つまり俺が見たデータベースリンクは
本来の使い方じゃない奴って事ですね。
ありがとうございました。
1インスタンス+データファイル群=1データベース
ってのもわかりよかったです。
それだから、Oracleはサーバ統合が苦手なんだな。 別々のデータベースをそれぞれスキーマにして統合すると、バックアップのタイミングなど運用上の問題が出てくるし、 インスタンスを分けるとリソース(共有メモリなど)がばらばらのままなので、統合した意味が薄くなる。 DB2やSQLServerならサーバ統合に合わせて自由にインスタンスを整理統合できるので、リソースの使用効率が格段に上がる。
Oracleがそこまで便利になったらDB2の立つ瀬はないだろう。 と思いつつもOS/400のDB2はデータベース一個しか作れなかったな。w まあ、アレはOSとRDBが融合しているので別モノだけど。
所詮コボラー専用箱だしな。 別途有料オプション購入で御賦せしないと他の鯖からSQLでアクセスできない囲い込み仕様。
OS/400はJavaの知識があればむしろ無料でSQLでアクセスでき
WASのBASEエディションとRationalの開発キットをタダでつけてくれる
IBM唯一の鯖なんだが。
むしろCOBOLer専用にすると返ってPCOMM端末のライセンスやら
洗濯機プリンターとか買わされるので高くつく。w
まあ、
>>144 みたいな勘違いしているCOBOLerは現実に多いな。
そういうのを含めてAS/400の不幸なトコなんだろうなぁ。
146 :
NAME IS NULL :2007/11/18(日) 17:33:01 ID:U6M3l2gU
>>125 私はJOINが複雑なSQLを読みやすくするため、「XXXX_ID」みたいに命名しますけどね。
たくさんのテーブルを結合するときに「同じ列名、違う意味」があるとSQLが読みにくいので。
>>146 125=119
べつに「ID」って名前にするなんて話誰もしてないよ。
でも最近、「ID」って名前にするのが前提の
フレームワーク、結構あるんだよねぇ。
スレ違いのところに投稿してしまってレス付かなかったので教えてください。 項目が2000個ある場合など、どのようにテーブル設計すればよろしいでしょうか? 項目名: 値 ----------------- TEST-0001:123 TEST-0002:789 : : TEST-2000:999
どうもこうもねぇな
150 :
NAME IS NULL :2007/11/19(月) 02:40:17 ID:bf1DMNXI
わけわかんねwww 取りあえず縦にもってるからそれでいいんじゃねぇの? 一体何を聞きたいかわからない じゃがいもと肉がある場合どのように料理すればいいでしょうか とそう変わらないとおもうぞ せめて味付けの方向性とかイメージきめようぜ 焼くのか煮るのか みたいな感じで
じゃがいもと肉ってわかってれば カレーどう?とか肉じゃがどう?っていえる。 この場合、「フライパンがあるんだけどどんな料理作ったらいいですか」 くらいに空虚かと思う。
これ縦にもってるんじゃなくて 列が2000あるって言ってるんだろ? TEST-0001列の値が123 TEST-0002列の値が789 : : TEST-2000列の値が999 列ごとにデータが1個しかなくてデータの増減がなければ そのままで問題ないと思うよ そうじゃなければデータ増えるごとにALTER TABLEして大変なことになるぞ
つかそんないっぱい列って作れるの?
154 :
148 :2007/11/19(月) 23:54:49 ID:???
こんばんわ。
>>152 さんの通り、列が2000あるのです。
そもそも2000列も横並べするのは馬鹿っぽいなと思いつつ、相関性のないデータなので
正規化もできません。まあ、いいかとSQLServerでテーブル作成しようとしたら横は1024列が最大でした・・・。
さて、どうすればよいのでしょうか・・・?
今のところ、テーブルを二つに分割する以外思いつきません。どなた様かお知恵を拝借したく。
155 :
NAME IS NULL :2007/11/20(火) 00:06:27 ID:fOu30nsb
>>154 それがマスタなのか登録されるデータなのか
その辺はどうなんだ?
こういうのだったら
項目名カラムと 項目名別のシーケンス番号でキーにしたりすることもあると思うんだけど
項目名IDカラム_項目名SEQカラム_データカラム
TEST_1_内容1
TEST_2_内容2
TEST_3_内容3
・
・
・
・
TEST_1999_内容1999
TEST_2000_内容2000
156 :
148 :2007/11/20(火) 00:13:43 ID:???
>>155 登録されるデータです。
↓これですと、一度の登録で2000行も追加されるのですよね?
10000回登録すると・・・行が増えすぎて不安です。
TEST_1_内容1
・
・
TEST_1999_内容1999
TEST_2000_内容2000
157 :
NAME IS NULL :2007/11/20(火) 00:43:47 ID:fOu30nsb
可能性として10000X2000 ほどはデータ登録の可能性があるってこと?
一体何のデータか抽象的すぎてわからないけど・・・
10000X2000ほど新規登録が発生するとしたら結構な量だなぁ…
まずは想定できるデータの規模をみんなに示してみては?
あまりに漠然としすぎて
>>155 程度のことしか言えなかったんだが
設計をするのであれば自分が持っている情報を出来るだけ伝えてほしい
XXX300位までは見た事あるけどなぁw どんなデータなんだろう
159 :
148 :2007/11/20(火) 01:57:12 ID:???
具体的には説明できないのですが、例えばで説明すると・・・ある工場用の自動荷物仕分けシステムです。 各配送先(この場合2000箇所)の振り分け数をチェックし、その件数が蓄積されるとしてください。 配送先1 配送先2 ・・・ 配送先2000 120件 140件 90件 これを週に1回集計します。 同様のシステムが10000台あります。 このような感じです。
>>159 その例なら列はまずいでしょ可変情報過ぎる。
入力元工場が1なのか複数なのかにも関わってくるし、
抽出要件として過去参照がどこまでさかのぼるのかにも
過去参照がないのであれば集計後DELETEとか
n週の過去参照であれば履歴テーブルを用意するとか
過去全参照だと・・・集計テーブルに集計データのみ残してって感じかな・・・
どれにせよ、そのテーブルは最大で2000*7*n工場のデータ数になるんじゃない?
161 :
NAME IS NULL :2007/11/20(火) 12:17:36 ID:AlZxTldT
テーブル数2000*7*n工場ってマジで言ってんの
162 :
NAME IS NULL :2007/11/20(火) 15:56:36 ID:fOu30nsb
そのDBへの挿入や更新はリアルタイムじゃなくて夜間バッチとかでやるような処理じゃないのか? それだったら別に1000万件とかでも平気だろ リアルタイムにやれとか言われたらかなり悩むけど
各システムは必ず2000件の配送先を持つのか。 2000件の配送先は増えたり減ったりする可能性は考えられないのか。 1万システム全体での配送件数が1日平均何件なのか。 例えばこれが全体で配送件数が5000件であれば、 配送件数として1日に増加するレコード数は最大5000にしかならない。 さらにもし1配送先に平均10件と仮定すれば 記録すべき配送先は500先なので1日で500レコード増加するに過ぎない。 (横持ちせずに(列で持たずに)、縦に持つようにした場合の話です。) と、思うがどうか。
164 :
NAME IS NULL :2007/11/20(火) 20:38:55 ID:wWhiZNbu
あぼーん
166 :
NAME IS NULL :2007/11/21(水) 01:04:15 ID:ejwf2SGm
横持ちしない場合ってこんなんだと思うけど、集計とかやりやすいのかな?素人なんだけど俺 ID 配送先 値 : : :
170 :
NAME IS NULL :2007/11/28(水) 16:44:05 ID:yMQT4KPq
なんかの本だかサイトで主キーのないテーブルはいかん! って見た気がするんですけど、 今、設計してて WEBのアクセスログを取るテーブルに主キーがいらない気がするんですよね。 削除はこの日付より前のものって感じでcronで削除するのでいらないし selectもgroup byとcountで集計しかしないので(index使われないですよね?たぶん・・・) どうなんでしょう? そういう設計はまずいのでしょうか?
171 :
NAME IS NULL :2007/11/28(水) 16:55:14 ID:+hnShCQ+
別にいいんじゃね?
困ってなきゃいいんじゃない?
それならいらねーんじゃね? 一日に1回くらいしか集計しないんだったらインデックスやらキーを つけるほどの事でもないし。 ただまあ、最近はフレームワークとかで主キーがあると ラクチンになるのもあるので、Webの画面に表示してどうこうする テーブルとかは普通に主キーを設定しておく方が無難ではあるな。
174 :
NAME IS NULL :2007/11/29(木) 01:36:40 ID:DGmlyzPU
大量のデータの場合、検索が遅い。 結局、DBMS側も一意のキーが特定できないと辛いのです。 経験則からなら○百万件以下のDBなら何も問題ないっす
ログなんだからそのうち○百万件超えるだろ
>>170 つーか、集計しておしまい程度のログを、
わざわざDBにログ突っ込む必要ないのでは?
5年分のログを記録とかだと、DBに突っ込んでおかないと軽く死ねるよ。 あと膨大な規模/台数を対象にログをとるとかさ。 おまいのところのちっぽけなサーバのログ取り程度じゃない世界もあるよ。
DBにつっこまないと死ねるアフォな職場環境の方が死ねると思うが。 アフォ構成を自慢されてもな。
ログをテキストで持ってて全文検索してる職場環境がゴミ。 オラクル動かしてる鯖のログなんて見てないのか(w
質問があります。 類似の項目が可変&多数ある場合どう設計すればいいでしょうか? 例えばイベント情報DB(一覧表示がメイン)で、 時間: 必須は開始と終了時間のみ。他に開場時間や最終入場時間などが追加の可能性。 料金: 当日・前売、席、男女、年齢などで異なり、且つ最低どれか1つが必須。 名称(イベントや会場): 正式名・一般名称・略称 があり、詳細表示は全て、一覧表示は後者2つのどちらかを使用、など。 今は下記で考えています。 ■基本テーブル 主ID/日付/開始時間/終了時間/他の時間リスト/会場ID/正式名/一般名称/略称/料金リスト/… ■会場テーブル 会場ID/正式名/一般名称/略称/住所/地図/… ●一覧表示時 主ID/日付/開始時間/終了時間/会場名(一般名称か略称)/イベント名(一般名称か略称)/料金(一部)/他の時間(一部)/… ●イベント詳細表示時 主ID/日付/開始時間/終了時間/他の時間(全て)/会場名3種類/イベント名3種類/料金(全て)/… 名称の重複は仕方ないとしても、時間・料金・割引をどうするか悩んでます。 各項目をすべてフィールドで用意すると空項目が多く無駄になるので、 可変部分は1つのフィールドにまとめて(○○リスト)、プログラム側での展開・処理を考えています。 (「開場#9:00 最終入場#16:00 △△時間#20:00 …」としてスペースと#で分割とか。) ただ検索が大変そうで…。 よくあるケースと思いますが何か定番の方法あるのでしょうか?
185 :
184 :2007/12/18(火) 19:28:38 ID:prFbnylX
すみません。sageてしまいました
>>184 頭んなかでアプリとDBがごちゃまぜになってないか?
名称の重複とかDB側では見当たらんし・・・
時間:
素直に開場時間や最終入場時間など用意しておいた方がいい
料金:
ちょっとメンドクサイね。
ホントにその条件なのか?当日・前売とその他が同列っておかしいくない?
名称(イベントや会場):
何を悩んでるのかわからない上に仕様不明確。DB設計よりもアプリ側の話
ところでリストってArray型?差し支えなければDB教えてくれんか?
187 :
NAME IS NULL :2007/12/20(木) 16:54:20 ID:F1yzUOQD
>>184 RDBで可変は限界がある。
無駄になると思いつつ空ばかりのレコードを作るか、
もしそれがいやならカンマ区切り等のセパレータで
区切られた文字列をつっこんでアプリで処理するのが一般的。
アプリ側の処理をある程度許容するのであれば、
まとめたい部分をテキストファイルにして、DBにはファイルパス
を入れておく。こうすると検索については全文検索に任せればいい。
SQLのLIKE文とどっちが速いかは分らん。
おすすめはデータベースを設計してみて容量見積もりをする。
その容量が許容できないほど大きいのであれば、どこかに
制約をつけるしかない。
Object Databaseっていう手もあるが、技術情報・技術者が
少ないのと速度見積もりが難しいので商業戦略としては
使いづらい。
そんな糞設計が一般的なわけがない
189 :
NAME IS NULL :2007/12/21(金) 12:00:45 ID:9gvFSqQa
カンマ区切り等のセパレータで 区切られた文字列をつっこんでアプリで処理するのが一般的。 これにはたまげたww
>空項目が多く、無駄になるので 空項目が多く、無駄になるのが一般的です
このスレってほんと投げられっぱなしだなwww
こんな感じでどうだ。 ■基本テーブル イベントID/日付/会場ID/正式名/一般名称/略称/料金リスト/… ■スケジュールテーブル イベントID/スケジュール名(開始・開場・最終入場・...・終了)/時間/一覧フラグ ※一覧フラグは、一覧表示画面に表示するかどうかをあらわす ▼開始時間ビュー(select イベントID, 時間 from スケジュール where スケジュール名 = '開始') ▼終了時間ビュー(select イベントID, 時間 from スケジュール where スケジュール名 = '終了') ■料金テーブル イベントID/料金名(当日・前売、席、男女、年齢)/料金/一覧フラグ ※一覧フラグは、一覧表示画面に表示するかどうかをあらわす ■会場テーブル 会場ID/正式名/一般名称/略称/住所/地図/…
可変カラムがあったらどうやるの? カラムが増えたらALTERするの?
>>193 =187
無知なだけかも知れんが可変カラムって聞いた事無いんだけど・・・
アプリ要求とTableを対にするって発想でも無さそうだし、理解が出来ない。
COL1=A,B,Cとして持たせるって
AをSQL条件とする検索とかの仕様変更来た場合はどうするつもり?
このやり方でカラム増やしたってシステム上改修は必須で、逆にCOL1のデータへのアクセス部分の調査が必要になるでしょ?
COL1で対応できない要求された場合はALTERなりで拡張するんでしょ?
わざわざ難しくしてるようにしか見えない
>>193 最初の要件で可変であることがわかっている属性があるならそのように設計する。
後から出てきたものなら設計変更。
197 :
184 :2007/12/24(月) 16:26:34 ID:???
遅くなってすみませんm(_ _)m
>>186 ●名前の重複: 名称の一部が重なる事です。例えば↓など。
・東京モーターショー2007/東京モーターショー/TMS (「東京モーターショー」が重複)
・東京国際展示場/東京ビッグサイト/BS (「東京」が重複)
●時間: 開始・終了時間以外は稀(200件に1件以下)と思うので個別だとほとんど空状態で無駄な気がします。
●料金: 入場の料金、○○の料金、…と分ける必要ないので同列でいいかと。
リストとは項目を連結させた文字列(TEXT型)。187氏のカンマ区切り文字列と同じです。DBはMySQL(レンタル鯖)。
>>187 的確なアドバイスありがとうです。
カンマ区切り文字列については意見色々ありますね。、
可変項目はよくありそうですが実際はどう対処してるんでしょ?
(検索対象なら個別に用意すべきでしょうが、検索不可だが必要な場合など。)
最初はPostgreSQLの配列型で出来ないかと考えてました。
>>192 以前はそれに近い考え(可変カラムを外部テーブルへ)でした。
(基本TBL「イベID/日付/会場ID/…」、時間TBL「イベID/時間名ID/時間」、時間名TBL「時間名ID/時間名」…)
正規化としては正しそうですが、一覧表示は問合せが1行(1イベント)ごとに発生して遅くなりそうで。
結局現時点では、
1) 時間と料金は検索不可にしてカンマ区切り文字列を使用。
2) 会場名やイベント名は置換と省略可能な書式にしてアプリ側で正規表現処理。
と考えてます。(
>>184 とは検索不可と会場名・イベント名を3種類から1つにまとめただけの違い)
ところで一覧表示で1行(1イベント)毎に会場名などを外部テーブルに問い合わせると遅くないですか?
(1行ごとに3件ほど外部テーブルへ問合せ。1ページ約100行なので300回。)
基本テーブルに会場名称を会場IDとともに登録して、表示は名称、検索はIDにしようと考えてるのですが。
正規化は知ってたのか。 だと、実務経験があまりないのかな。 正規化するとパフォーマンスが心配というなら、 「外部テーブル」が何件くらいになりそうか 見積もってみれば。 MySQLも含めていまどきのデータベースなら、 数万件から数十万件のテーブルから数件のデータを とってくるのは一瞬のはず (DBの先人は、そういうデータ取得を 高速化するためにまっさきに工夫してきたので)。 データがそれより大きい場合、いろいろ 考えなきゃいけないかも。でもその場合でも、 正規化したデータを前提にしたDBの パフォーマンスチューニングが正道。 天才プログラマなら、ユニークな 方法で大成功するかもしれないけど、 そうでないなら教科書通りにやるのが吉。
>>197 おまえ様は、RDBでの設計知識は全然ないだろ。アプリ屋だね。
RDBなんだよね?SQLって知ってる?結合(JOIN)ってわかる?
ごく普通にJOINすれば良いだけだろ?
なんで、一覧表示するのに、イベント1行検索して、その後、会場名検索するの?
SQL一発で、イベントも会場も時間も全部入で100行でも1億行でも拾えるだろ。
それとも、そのレン鯖はJOINのコストが気になる様なマシンスペック&
データ量なのか?
200 :
NAME IS NULL :2008/01/07(月) 19:35:26 ID:ivk9xsoC
マスタって例えばどんなデータが対象になるんでしょうか。 定型的なパターンとかありますか?
なんと難しい質問。 人間って何?って言われてるみたいだ。
とかいうのもなんなので、定説みたいなのは、 〜名ってつくものはリソース、つまりマスタとみなす、 なんてよくいいます。 顧客名、ユーザー名、などなど。必ずしもそうではないんだけど。 まあ考え方の目安として。 逆に、マスタじゃないのはトラン系とかイベント系とかいって 〜日ってつくもの。 受注日、出荷日とか。 てな答えでいいのかなあ・・・。すげー難しい質問だ。
すんません、
>>202 はちょっと言葉たらずだった。
顧客名、ユーザー名、って〜名がついてもおかしくないので
「顧客」や「ユーザー」はマスタ系テーブルと見なしてもいいかもしんない。
受注日、出荷日、って〜日がついてもおかしくないので
「受注」や「出荷」はイベント系テーブルうんぬん。
って事です。
上のだと、「顧客名」って属性だけがマスタと呼ぶ、みたく思われ可燃。
要は「もの」と「こと」って事かと。
業務的に帳票化して管理しているようなデータ集合をマスタって読んでることが多いな。 個人的にはマスタって言葉に違和感を感じるが、業務を遣ってる現場の連中がマスタって呼んでるので合わせてる。 正規化ってあんまり気にしなくても実害は少ないと思う。 コボラーとか旧世代の作った業務システムのデータなんて何万列も一つのテーブルで存在して正規化以前の状態で業務で使われてたりするし、 設計、開発当初はきっちり正規化してみたけど、現場の声でこのデータも欲しいと列をどんどん追加していったら、あんまり正規化されなくなってしまったなんて状況もあったりするし。 定期的にシステム更新して、正規化した構成に改善していくのが理想とは認識していても、現実は遣れてなかったりする。 正規化したからって売り上げに直接響くような資料を作って決済もらうのって、なかなか難しいし。 それより、パフォーマンス改善策として、より性能の高いハードウェアに更新しますって理由の方が予算/契約は取りやすい。
>>204 俺もトラン、マスタって嫌い。
イベント、リソースだとわかりやすい。
正規化しなくても実害が少なく思えるのはね、
DBのクソ設計をアプリで一生懸命カバーしてるからで
そのアプリを残業しながらメンテしたりしてる人達がいるって事だよ。
転職前の俺がそうだったもん。
その非正規化を否定することって、自分を否定してるようなもんだね。 それで飯食ってたんだから・・・。
自分を否定する事なんかしょっちゅうだよ・・・。 つか、否定しようとしないから色々と大変なんだろう? 今までネットワークDBでやってきた自分のやり方とか、 そのままRDBに適用したり。
コボラーなんて古い設計を否定せずに使い続けるしなあ。 コボラーの進化って止まってる(w
209 :
NAME IS NULL :2008/01/11(金) 17:00:48 ID:7xR6a2PU
しかし、コボラーの設計思想というのは、 スタイリッシュではないが、何が起きても大丈夫なような安心感がある。 あれこれ頭を痛めるよりは、淡々と進めた方がいい場合もある。
>>209 違うよ。何が起きてもどうにかする人が居るんだよ。
設計自体は、わざわざ何かが起こり得るようになっている。
最初に頭痛めれば起こり得なくなる何かが。
>スタイリッシュではないが、何が起きても大丈夫なような安心感がある。 安心感と言うか、感覚がズレてる感があるな。 ホストからの電文が一部ロストしたら、その後のキューにたまった電文が 全てズレで帳票印刷されて、壮絶な障害が発生した事があるんだが、 「 そ れ は 仕 方 な い な」 と力強いコメントいただいた事がある。 アフォかと
証券システムの日米比較で、「スペースシャトルと乳母車」に例えられるくらい、日本の汎用機コボラーはショボイ。 殿様抱え込み商法の超ぬるま湯団塊親父の吹き溜まり。
安心感は全くないな。 列が何万行もあって、明らかに遅くなるテーブルを、何の疑問すら持たずに使い続けてるだけだよ。 コボラーの空気読めなさは異常。 テーブルの正規化でパフォーマンス改善できるのに、ひたすらハードウェアの性能でパフォーマンス改善しようとする。 そこそこ早い鯖なのに、遅いからしょうが無いとか言い出すし。コボルで組んだお舞らのバッチが遅いだけです(w
重くてもしっかり動けばいいんだけど、やつらは付け焼き刃のバベルの塔を築くからなあ。 自分しか分からない(自分でも?)ようになっちゃって、既得権益を守ってきた。
その方が高い鯖売り逃げることが出来るからな ベンダとしてはコーダーを文盲統治したいところ
技術的に正しいことが必ずしも商売として正しいとは限らないという事か
>>211 >「 そ れ は 仕 方 な い な」
これで済むのか!無茶苦茶安心だ!
>>216 短期的にはそうだねぇ。
でも長期的にはいつかツケが回ると思ってる。
特に中小は。
>>218 そのツケが大きいところまで回ってきたのが、東証全面ストップ。
これも付け焼き刃で対応している筈なので、遅かれ早かれまた大規模な障害が出る。
そして東京市場が見捨てられている。
長期的な視点があってもそれまで生きていなければ意味は無いから絶妙なバランスが必要だな。 つい読んでしまったけどこれマ板ネタじゃね。
>>220 短期を乗り越えられるだけの現金は持っておけ、とか。
理想論かな・・・。
東証のダウソや誤発注が通ってたのってコボラーの仕業なのか。 仕方ないねって平気で言いそうだ(w
凍傷は不治に損害賠償求めたんだっけ
すみません売掛金計算方法について助けてください。 販売管理のDB設計をしています。 日々、販売するごとに価格、売上数を売上テーブルに入力していっています。 また、売上の入金があるたびに、入金額を入金テーブルに入力していっています。 このとき、販売先別の売掛金や請求額、またその繰越残高を算出するために、 皆さんはどうやっていますか? 1日から月末までの計算ならいいのですが、請求額などは販売先ごとに締日が違っていて、 単純に計算するのは難しく悩んでいます。 自分の考えでは、 1)過去の売上テーブルの売上額の総合計−過去の入金テーブルの入金額の総合計=売掛残高として計算する。 2)売掛テーブルを作成し、月イチや毎日のバッチ処理で、その月の売上合計と入金合計を売掛テーブルに保存する。 そして売掛テーブルの売上げの総合計−売掛テーブルの入金の総合計=売掛残高として計算する。 3)売掛テーブルを作成し、月イチや毎日のバッチ処理で、その月の売上合計と入金合計を売掛テーブルに保存し、 さらに前月繰越額も計算して同じレコードに保存する。 の3つが考えられそうな気がしています。 ただ、1)だと締日が異なる販売先を一覧で表示する場合には、union等を使った複雑なクエリになりそうですし、 3)だと過去のデータを変更されると、それ以降の繰越額が全部ズレてくるので、それをすべて 修正しなければならず、2)が妥当なやり方のように考えているのですが、皆さんはどうしておられますか?
>>224 俺なら、同時更新(リアルタイム) と日バッチ(チェック+補正)で作るかなぁ。。。
DBだけでなんとかしようとしないと思う。
アプリでなんとかするw
アプリの話は、すれ違いになりそうなのでやめとくね。
締月属性用フィールド追加
あまり深く考えないで答えると、売掛金って勘定なんだから そこには締めの概念が社内にかならずあるはず。 なので2。 請求先の締め日は、いつお客さんに請求書を送るかに関わるところだから、 債権管理には関係ないんじゃない? 社内の管理会計は当然その社の締めに基づいてされるはずだし。 どういう帳票を出したいのかがどうもイメージできない・・・・。
>>225 ありがとう。自分もソフト側での更新も考えてます。
ただ、その時のDB設計はどうなのかと思いまして。
詳しくは下記の
>>227 さんへのレスを参照してください。
>>227 ありがとう。自分も2が適当なのかなと思っていたのですが、不安で・・。
ちょっと質問の仕方が適当でなかったかもしれません。
つまり、売上テーブルに販売数×販売価格を保存し、入金テーブルに入金額を保存していくとき、
売掛金を計算する場合に、皆さんはどのようにされているか、そしてそれを選択した理由が
何かをお訊きしたいということです。
1)売上テーブル、入金テーブルから、ある販売先のレコードを全て抽出し合計値から計算する
2)1)だと膨大な数になりそうなので、集計テーブルを用意し、そこに月ごとの売上金額と
入金金額をまとめた数値をバッチなり、同時更新なりで計算し保存していく。
イメージ的には「集計ID, 売上年月, 販売先ID, 今月の売上金額, 今月の入金金額」となる感じで、
これをsumすることで1)と同じ要領で売掛金を計算する。
3)やり方は2)と同じですが、フィールドを
「集計ID, 売上年月, 販売先ID, 今月の売上金額, 今月の入金金額, 前月の繰越金」とし、
やはりバッチなりリアルタイム更新で保存していく。
ただし、この場合は、前月繰越金+今月の売上金額−今月の入金金額を計算すればok。
ですが、問題もあって、
1)データ件数が多くなると計算が遅くなりそう
2)1)ほどではないが、1ヶ月ごとに販売先の数だけレコードが作られるとやはり遅くなる?
3)計算は速そうだけど、過去のデータを修正すると、それ以降の繰越金がすべて再計算になる。
ということになりそうなので、果たしてどれがいいのかと、お知恵を貸していただきたかったわけです。
>>226 すいません。締月属性用フィールドという意味がよくわからないので、
よければ詳しく教えてください。
2のバッチでのサマリーテーブル生成を選択した 最大の理由は、パフォーマンス対策です。 そのためにあえてone fact in one placeの原則をやぶるわけです。 債権残ってのは過去全ての取引の蓄積であって そんなもん都度サマってたら、何年かして死んじゃう。 ついでに前月繰越残(要するに前月データ)も並べてもっておくと帳票出す時に楽。 うーん、これは異論ありそうだなあw でも管理会計帳票って重くなりがちなんでこれくらいは許して欲しい。
>>229 なるほど、ありがとう。実質的には3)のやり方ですね。
ただ、3)だと、仮に過去の編集を許すとすると、それ以降の繰越金が全部変更になりますね。
まぁ、リアルタイム更新でなくて、バッチ処理なら問題ないし、
そんなに重い処理にはならないと思うけど・・・。
ひょっとしたらフィールドは2)の方法保存していき、
ビューで前月のレコードを表示させるようにすれば計算も速そうだし、
リアルタイム更新にも対応できそうだし、いいのかな?
集計 : 集計ID. 今月売上, 今月入金, 集計年月 とすると
SELECT 今月売上, 今月入金,
(SELECT SUM(集計2.今月売上)-SUM(集計2.今月入金) FROM 集計 AS 集計2 WHERE 集計2.集計年月 < 集計1.集計年月) AS 前月繰越
FROM 集計 AS 集計1 WHERE 集計年月 = '2008/01/31'
いい方法なのだろうか・・・(;´Д`)ウウッ…
>>230 締めた後の過去の編集なんて、そもそも業務としてまずい。
普通は赤黒処理して当月側で処理します。
会計締めってそれだけタイトな業務なはず。
本来なら、ですけど。
そこまでの要望がない軽いシステムってのもあるだろうから
そうならどういう作りしてもどうとでもなりそう。
あとは好みなんじゃない?
連投すまんですが、 まずはお客さんに過去売上の修正について 管理会計上どう処理してるか聞くのがいいと思うよ。 俺のお客さんでやっぱり適当に過去の売上いじってて 会計は会計事務所まかせになってて いじった過去の売上をそのまま事務所に伝えてるだけってのがあった。 会計事務所側では恐らくちゃんと当月側で打ち消し仕訳起こしてるはずで そうなると、月次の会計データと社内の売掛金データに食い違いが 出来てるはずなんだけど、それで仕事は回ってんだからいいんだ、って話になった。 しかも法律事務所。
データベース設計ツール探してるんだけど、何かないだろうか? dbwrenchとか SI Object Browser ER 4 みたいなソフトで、フリーなのがないかなあと。 できれば日本語ドキュメントの生成も対応していて。
TOADは? フリーのはみんな記法がいまいちでなー。
236 :
NAME IS NULL :2008/01/25(金) 19:31:34 ID:yAWOBhhy
今、渡辺幸三さんの「業務別データベース設計のためのデータモデリング入門」という本を読んでいるのですが、 作出属性というのがよくわかりません。他の列の値を使って計算した結果がはいる列のようなもののようですが… OracleやSQLserverなどでテーブルを作るときには固有属性の列などと同じように作るのでしょうか? 計算した値はどうやって入れるのでしょうか?
「作出属性」はその人の造語じゃないの? たぶん、SQL-Server の計算列みたいなものかと。 > OracleやSQLserverなどでテーブルを作るときには固有属性の列などと > 同じように作るのでしょうか? Oracle は知らんけど、SQL-Server なら Yes. > 計算した値はどうやって入れるのでしょうか? 列を定義する時に、式を定義しておくと計算結果が自動的に入る。 と言うか、実体はなくて select した時に計算して列を作る。 とりあえず、SQL-Server 計算列 でぐぐれ
238 :
NAME IS NULL :2008/01/26(土) 01:32:14 ID:uG1o+X6G
>>237 有難うございました。計算列(仮想的な列)を 列名 AS 計算式 で定義しておけばselect時に計算してくれるのですね。
これは親テーブルなどの列の値を計算式に使ったりもできるのでしょうか?
渡辺さん、本人に聞けば教えてくれるよきっと。
240 :
NAME IS NULL :2008/02/10(日) 06:01:35 ID:tRxMhI5F
今やってる仕事なんだが、せっかくデータベース使っているのに、 一部のデータをテキストファイルで持っているんだが、こういうのってよくある話なんですか? 具体的にいうと、商品テーブルというのがあって以下のカラムを持っている。 ・商品コード ・商品の種類 商品名が無いので、どこにあるかと思ったらテキストファイルに以下のように格納されてた。 1,コカコーラ350ml 2,みかん 3,餃子 担当者に何でテキストファイルにもっているのか聞いたら、 「作ったのは俺じゃないから知らないけど、優秀な技術者が作ったので何かしら意味はあると思う」 と言われました。 テキストファイルにデータを持つというのはよくあることなんでしょうか? メリットがあるとしたら何でしょうか?
>>240 ありがちなのはそのシステムがさらに古いシステムからのリプレースで、
仕様書がなくよくわからないところはそのままにしとこうなど安易な理由で、
旧プログラムやロジックをそのまま使うためにそういうのを残すことがある。
CHAR(80)なフィールドにCOBOLの固定長レコードをぶち込んだだけのテーブル
がごろごろしてたのを見たときは逃げたくなった。まさに底辺。
Oracleだと、漢字の読みでソートというのができたと思うけど、 例えば、 安部(あべ) 木村(きむら) 斉藤(さいとう) のように。 MySQLでこういうのはできる?
社会保険庁じゃないんだから 読みのフィールドを持てば済む話
萩原さんと荻原さんの区別はどうするんだろうか
て言うか、エスパーじゃないんだから振り仮名なしで | 神戸 (こうべ、兵庫県) | 神戸 (ごうど、埼玉県 川口市) | (他にも がうど、かうど、かど、かのと、かみど、かんど、かんべ、ごうと、 | こうど、ごうどう、ごおど、ごおと、じんご とかがあるらしい) とかをどうやってソートしろと言うんだ?
その辺は気合いで. とか言う設計者が多摩にいるから困る.
渋谷にもいるぜ
>>240 工数と条件の間で苦心した結果の可能性は捨てきれないけど
>「作ったのは俺じゃないから知らないけど、優秀な技術者が作ったので何かしら意味はあると思う」
こんな事言う奴の「優秀」を信じないに1票
組織によっては「何もしない」ことが優秀である件
組織によらず、同じ結果がでるなら「何もしない」方が優秀である件
ただの文字データから前後関係で 読みを的確に推測するとは Oracleってすごいんだね。高いのもわかるわー。
>>251 あれじゃ改修が発生した場合ネックになって複雑仕様を余儀なくされるようになる。
作り投げ屋や派遣なら関係ないけどね
>>253 改修が発生してもネックにならないのであれば
「同じ結果がでるなら」に該当しないので
>>251 の言っていることは正しいと思う
て言うか、状況もよくわからんのにネックになるなんて断言できる奴って 多分エンジニアより営業の方が向いてると思う。
>>241 ていうか、今俺の仕事まさにそんな感じなんだけど、
コボラーに負けそうです・・・。負けたらそうなるんだろうなあ・・・。
257 :
>>240 :2008/02/11(月) 00:49:42 ID:PqAiPtIR
みなさん、ありがとうございます。 確かに、そのシステムは以前コボルで作られていたそうです(今はC)が、 以下の理由でリプレースになったんだとか。。 ・団塊世代の退職で、システムを保守できる人がいなくなる。 ・引継ぎすべき団塊世代の担当者が優秀なのだが、昔かたぎの職人で、質問に罵声で返答する。 ・ドキュメントは誤字脱字、嘘ばっかり書いてある。 ・で、引継ぎの先陣隊長が「こんなシステム引き継ぐぐらいなら会社やめてやる!」ぶち切れた。 となって、 結局リプレースになったんだとか。。
>>257 そういうオヤジのことは「優秀」とは言わない。
(今はC) ここに突っ込んでもいいですか?
きっとうわべだけリプレース
置き場所移動しただけ
それじゃリロケート
>>257 それってCのを書いた「優秀な技術者」=引き継ぎの先陣隊長なの?
結局その人辞めちゃったの?
265 :
>>257 :2008/02/12(火) 01:49:03 ID:???
>>264 >それってCのを書いた「優秀な技術者」=引き継ぎの先陣隊長なの?
違います。
「優秀な技術者」の上司=引き継ぎの先陣隊長
ですね。
「優秀な技術者」は別のプロジェクトにいったそうです。
>結局その人辞めちゃったの?
辞めてはいないです。
ちなみに、そのぶちきれた先陣隊長は30代の人なんですが、
なんかこの業界って団塊の世代と、30代の人ってやたらすぐに切れる人多くありませんか?
この世代って人数が多いから闘争心なんかも異常に強いのかもしれませんね。
どこかの大学の実験で、ねずみを多く入れた箱と、少数のねずみを入れた箱を比べたところ、
多く入れた方の箱は少ないほうの箱より攻撃的になったと聞いたことがあります。
JRで以前、年齢別の車内暴力事件や飛び込み自殺を調べたところ、
団塊の世代と30代の男性が一番多かったとか。。
30代はむしろ少ないだろ。 バブル世代は39以上だし、それより下は氷河期で。
>どこかの大学の実験で、ねずみを多く入れた箱と、少数のねずみを入れた箱を比べたところ、 >多く入れた方の箱は少ないほうの箱より攻撃的になったと聞いたことがあります。 狭い場所に多くいるんだからストレス溜まって当然だろう >JRで以前、年齢別の車内暴力事件や飛び込み自殺を調べたところ、 >団塊の世代と30代の男性が一番多かったとか。。 人数ベースで比較したら団塊と団塊Jr.が多いのは当たり前 ソースは?
しかしアレだな。 なんでもかんでもカゴテライズしないと安心できないヤツ ってのはいるもんだな。 漏れは業務ではそれを適切に行うのが仕事だけども 根拠のない思い込みで団塊がどーとか語るエンジニアいたら ソイツはこういう仕事に向いていないと思うぞ。
あれ?レスをよく読むと・・・
270 :
NAME IS NULL :2008/02/21(木) 07:51:39 ID:MnpsKLDC
共通テーブルの扱いについて質問させてください。 あるプロジェクトAで使っているデータベースhogeに社員テーブルがあります。 今度、新しいプロジェクトBが立ち上がりましてデータベースfooを作りました。 プロジェクトAと同じように社員テーブルが必要なのですが、 共通テーブルとして社員テーブルを持たせるようにするか、 各プロジェクトの各データベースの中に社員テーブルを持たせるようにするか悩んでおります。 共通テーブルとして社員テーブルを作れば、メンテナンスが楽だなとは思うのですが、 テーブルのjoinができなくなるので大変かなと思ってます。 各プロジェクトの各データベースに社員テーブルを作った場合、 データベースhogeで更新した社員テーブルをデータベースfooの社員テーブルに どのように反映するかが課題となります。(こういうのにトリガつかっていいんでしょうか?) このように、複数のプロジェクトで共通に必要とするテーブルがある場合、 皆さんなら共通テーブルにしますか?各データベースの中に社員テーブルつくりますか?
>>270 DBサーバーが別ということならレプリケーション。
一方向のレプリケーションなら運用も楽。
272 :
>>270 :2008/02/21(木) 23:36:26 ID:J1OJ+3YP
>このように、複数のプロジェクトで共通に必要とするテーブルがある場合、 DBを分けない
274 :
>>270 :2008/02/22(金) 07:20:10 ID:jGuXLD6i
>>273 たとえば、勤怠管理システムと給与計算システムがあったとします。
この場合、それぞれのシステム毎にDBもつのが自然ですよね?
オマエは一度MS Accessでもいいので簡単なアプリ作ってみろ
>>274 要件による。
特に要件がなければ分けない。
>>274 システム毎にDBをもつと
1.データの共有が面倒
データの不整合が生じる場合がある。
2.サーバーに負荷がかかる
メモリーやセマフォなどのサーバー資源をDBごとに持つから
DBを2つにすると、サーバー資源は2倍になる。
結果として、パフォーマンスの低下を招く恐れがある。
欠点ばかりで、よいところはひとつもない。
どうしても分けたいなら、DB単位でなくスキーマでわけるとか。
>>270 >共通テーブルとして社員テーブルを作れば、メンテナンスが楽だなとは思うのですが、
>テーブルのjoinができなくなるので大変かなと思ってます。
なんでJOINできないの?
DBなにつかってんの?
279 :
>>270 :2008/02/23(土) 11:02:16 ID:plV93xd4
>>278 DBはMySQLを使っています。
異なるデータベースのテーブルをjoinすることができるDBってあるんですか??
280 :
278 :2008/02/23(土) 12:20:45 ID:???
>>279 MySQLわかんない…
SQLServerだったら同一インスタンス内の別DBのテーブルは
SELECT * FROM foo.dbo.xxxx AS A
LEFT JOIN hoge.dbo.社員テーブル AS B
ON A.社員ID = B.社員ID
とか。
別サーバのDBであってもリンクサーバの設定をすれば、レプリケーションせずとも
[リンクサーバ名].[DB名].[スキーマ名].[テーブル名]
で見に行ける
>>280 MySQLだからって部分じゃなくね?つか出来ないのってあるの?
両方の参照権限あるユーザであれば select * from db1.table1, db2.table2 出来て当然。
>異なるデータベースのテーブルをjoinすることができるDBってあるんですか?? そりゃまあ、商用RDBのDB2なんかは select * from Oracle.table1, MySQL.table2 みたいな結合もできるが、あんまやらん罠。 つか、相手が嫌がるケースが多いし、「勤怠管理システムと給与計算システム」 とかなら社員が何万人いるか知らんがMySQLだけで十分だろ。
シェンロンも作ってんのか? すっげぇな、おめぇら
>システム毎にDBをもつと >1.データの共有が面倒 >データの不整合が生じる場合がある。 >欠点ばかりで、よいところはひとつもない。 >どうしても分けたいなら、DB単位でなくスキーマでわけるとか。 システムが別なら、DBも別にするべきだろ? たとえば、あるサーバに勤怠管理システムと給与計算システムが動いてたとするだろ? それで、一つのDBに二つのシステムで使われているテーブルが全部入っているとする。 ある日、なんらかの理由で給与計算システムだけ別のサーバに引っ越すことになった場合、 そのDBで使っている給与計算システムのテーブルがどれなのか調べるのが面倒じゃん。 だから、1DB=1システムで使用するDBであるべき。だと俺は思う。
どのシステムがどのデータベースの中のどのテーブル 使ってるかぐらいは把握しとこうよ。
286 :
>>284 :2008/02/27(水) 01:47:11 ID:???
>>285 業務で使うテーブルなんて1システムで100テーブルはザラ。
そんなのを把握しようとするのが間違い。
人間は間違いを犯すという前提で、考えるべきだと思う。
284の人気がどこまで上がるか。
>>274 ネタなのか釣りなのか。とりあえずマジレスしてみよう。
少なくとも業務システムだと、サブシステム一式をサーバ単位で分けるなんて
設計はあり得ない。(「3層クライアントサーバ」でぐぐれ)
Web系のシステムだと、
Webブラウザ ⇔ ロードバランサ×2 ⇔ Webサーバ×4 ⇔ アプリケーション(AP)サーバ×4 ⇔ DBサーバ×2
とかになってるのがふつー。(「⇔」の部分はネットワーク接続な) 規模が小さ
くてサーバが共存してるケースはあるけど、論理的な構成はあまり変わらない。
(他に、NASやSANやバックアップ装置なども付随してたりはする)
勤怠管理システムや給与計算システムみたいなやつは、サブシステムとして
全部APサーバにぶらさがってる。APサーバ間のセッション共有は、クラスタ化
するとか、セッション情報を全部DBやメモリキャッシュサーバに持たせる。
DBの分割はあくまで業務を基準に分けられる。サブシステム単位ではない。
例えば上記の勤怠管理と給与計算だと、社員マスタあくまで共通。
289 :
288 :2008/02/27(水) 03:17:47 ID:???
290 :
288 :2008/02/27(水) 03:30:08 ID:???
288の下2行、微妙に話がずれてるような気がするので補足。 サブシステム間で共通する情報を持っている場合(前述の社員マスタとか)、 DBのインスタンスは共通で、各サブシステム固有の情報は同一インスタンス内 の別テーブルに格納するのが普通だと思う。
「人間は」なんて言ってるけど、ホントは284が犯しちゃったとか?
>>288 >DBの分割はあくまで業務を基準に分けられる。サブシステム単位ではない。
おれは
>>274 じゃないですが、業務とサブシステムって何が違うんでしょうか?
業務=業界?(たとえば、医療システム、建築システムみたいな単位?)
サブシステム=(たとえば、医療システムの中の、電子カルテシステムみたいな単位?)
であってますか?
>>294 業務全体は複数の業務から成る。
システム全体は複数のサブシステムから成る。
一連の業務は複数のサブシステム+人間系を組み合わせる形で実現され、
それらの業務がさらに互いに関連し合う、というイメージ。
例えば「受発注」という業務だと、
見積依頼→見積回答→発注→納品→検収
みたいな流れがあって、これが複数のサブシステムから構成される。
(例えば受注側と発注側とか、見積系と発注〜検収系、みたいな感じ。
どう構成するかは設計者次第かなぁ)
で、これはこれだけで成立するとは限らなくて、予算管理や工数管理
などの業務と連携し、業務/システム全体を構成したりするわけだ。
こうしている間にも284は何らかのシステム開発に関わっているのだろうと思うと、世の中怖くなる
テーブルの正規化
298 :
NAME IS NULL :2008/03/05(水) 00:29:20 ID:D2n410NJ
このたび、社内で日報システムを作ることになりまして、 みなさんのご意見をお聞かせいただきたい事があります。 以下の情報をテーブルで管理しようと思っています。 ・日報ID(主キー) ・日報を書いた日付 ・社員ID ・社員が書く日報(二バイト1000文字) これらの項目を一つの社員テーブルとして管理したほうがいいのか、 それとも経歴に関しては容量が大きいので、経歴テーブルというものを 別に作ったほうがいいのか迷ったのです。 性能を考えた場合はこうするべきだとか、保守性を考えた場合はこうするべきだとか いろいろ考え方があると思うのですが、みなさんのご意見をよろしくお願いいたします。
>>298 用語の統一って大事だよな。
なんにせよ社内システムでしょ?
俺なら拡張ありきと考えて、ある程度予測立ててTABLE分ける。
社員マスタ - 社員ID - 氏名 日報 - 日報ID - 社員ID - 内容 - 日付 ていうか経歴テーブルってイ可?
301 :
>>298 :2008/03/05(水) 01:11:15 ID:D2n410NJ
すいません。。。かきなおします。 (自分のメモ帳で、全件置き換えしてそのままはりつけちゃいました。。) このたび、社内で日報システムを作ることになりまして、 みなさんのご意見をお聞かせいただきたい事があります。 以下の情報をテーブルで管理しようと思っています。 ・日報ID(主キー) ・日報を書いた日付 ・社員ID ・社員が書く日報(二バイト1000文字) これらの項目を一つの社員テーブルとして管理したほうがいいのか、 それとも社員が書く日報に関しては容量が大きいので、 日報テーブルというものを 別に作ったほうがいいのか迷ったのです。 性能を考えた場合はこうするべきだとか、保守性を考えた場合はこうするべきだとか いろいろ考え方があると思うのですが、みなさんのご意見をよろしくお願いいたします。
しね
>>301 自分が一生そのシステムの面倒見るなら好きに作れ。
他人にメンテさせてくなら、外部のSIerに作ってもらえ。
正直、その程度の事を他人に聞かないと判断できない人間が
やるべきではないと思うが。
>>303 >正直、その程度の事を他人に聞かないと判断できない人間が
>やるべきではないと思うが。
同意
社内でって言うんだから練習なんだろ 外で失敗するよりいいじゃまいか
あまりに初歩的すぎるからな。 ここで答えを書いてしまうのはよくない。
>>301 テーブル分けないほうがいいと思う。
SQL作るのめんどくさいし、性能の面からいっても、たぶんテーブル分けないほうが、
DBの中でテーブルとテーブルを接続する処理がいらないので早いと思う。
>>301 > これらの項目を一つの社員テーブルとして管理したほうがいいのか
社員テーブルという名前でなくて日葡テーブルという名前にすればよいと思います。
>>307 おぃおぃこのスレはいつの間にこういう輩を呼び込むようになったんだよ・・・
過疎板の過疎スレの分際で態度だけはデカイな。ここの住民どもは。
312 :
NAME IS NULL :2008/03/07(金) 21:08:00 ID:uMhc0dqS
来月の情報処理試験のデーターベーススペシャリスト試験を目指しているものですが、 モデリングの理解が難しくて四苦八苦しています。 業務の実例からモデリングするようなことを解説している本とかないでしょうか? プログラマーとしてずっとやってきたのですが、 データーベースの概念設計からやったことは一度もないので、 その辺の知識を補いえたらと思います。 このスレは、色々探していたらヒットしたのですが、 データーベーススペシャリスト試験にも出ている内容が多くて非常に参考になります。 このスレがもっと延びていたら、よかったのにと思います。
booch
314 :
NAME IS NULL :2008/03/09(日) 02:23:23 ID:9zjRbvkF
create table hoge(id foo bar); このテーブルでfooとbarが頻繁に更新されて、 idが滅多なことでは変化しない場合はインデックス使うべきでしょうか?
idが滅多な事では変化しないって 変化する事がありうるの? idじゃないじゃんそれ。
>>315 id をバンバン更新する方が普通じゃないと思うが...。
例えば、社員情報テーブルで社員番号がころころ変わるのが普通って
言ってるようなもんだぞ。
>>314 インでクスってそのフィールドが更新するかどうかより、そのフィー
ルドが頻繁に検索に用いられるかどうかの方が重要だと思うけど?
まあ、今時ストレージの値段が下がってるので、更新が少ないなら闇
雲にインデックス張ってしまっておくのも悪くないと思うが。
>>314 更新するときは where id=? だろうから
id にはインデックスを使って foo bar にはインデックスを使わない
がいいんじゃね
318 :
>>316 :2008/03/09(日) 12:51:20 ID:???
今保守させられてるアクセスなんだけど、入力フォームがうまくコーディングできないからって マスタテーブルに手を入れて解決するのはやめてほしかった。全システムでそのマスタを 使ってるので、入力フォームの変更依頼が来て、全システムを見直さないといけなくなった。 まじ泣きそう。
人の作ったものの面倒見るのって大変だよな。 ちなみにオレ面倒みさせて困らせる方。
321 :
NAME IS NULL :2008/03/12(水) 00:38:30 ID:SqdK6BYY
「実践!!データベースバイブル」という本に、 "更新が頻繁に発生するテーブルはテーブルのサイズを小さくするべき"とありました。 これはどのような理由からなのでしょうか?
そのテーブルに索引があったるすると更新される旅に索引が再作成されたり してパフォーマンスが落ちたりするから。
>>321 前後に説明がないか?前提や文脈なしでは答えられんと思うが。
ほんとにそれだけしか書いてないならそんな本読むな。
1レコードのサイズのことかテーブルの総容量、レコード件数のことかくらいはっきりしないと答えられないだろ。
>>323 全件走査のようなまねをしない限りパフォーマンス上の問題はないと思うけどな。
問題になるのはバックアップや索引再編に時間がかかるようになるということ。
重箱スミですまんけど、「更新される旅」って 自己啓発ぽくてなんか自分探してる感じがしますねw
325 :
>>321 :2008/03/13(木) 01:33:43 ID:9sO5R5ZC
>>322 なぜ、索引がテーブルのサイズと関係あるのでしょうか?
マンガの索引は1ページだけど、辞書の索引は数十ページあるよね?
>>321 >>323 さんの指摘のように、1レコードのサイズのことかテーブルの総容量、レコード件数のことかはっきりしないが、
サイズを小さくできるなら、どんなテーブルでも小さいに越したことはない。
ACID の原子性と独立性って意味するところかなり被ってないっすか?
Dirty Readを行うトランザクションだと、 原子性(Atomicity)は保障されているかもしれないが、独立性(Isolation)は保障されない。
330 :
NAME IS NULL :2008/03/15(土) 19:23:15 ID:JuJf5Jao
きっちり第3正規化まですれば教科書的にはOKのはずが、 情報システム部のアホどもにコードだけじゃテーブル見ただけで内容がすぐに わからないだの、全ての金額が1テーブルから取得できないから使いづらいだの 言われて激しく萎えた…
>全ての金額が1テーブルから取得できないから使いづらいだの これ本気で言ってるとしたら馬鹿だな
> 全ての金額が1ルーブルから取引できないから nimieta
>>330 アプリケーションをつくる側の率直な意見だろ
正規化されたテ−ブル群とアプリケーションの作り手のデータのイメージの間に
レイアーが必要なんだよ
ビューでもいいし、データを抽象化させたクラスライブラリーでもいい
>>330 要件の認識相違が発生してそうだな。
情シス的にはアプリケーション用の簡易インターフェース(アプリ要求に対応するviewとかね)まで用意されてるって聞いてるかもな。
335 :
NAME IS NULL :2008/03/17(月) 22:14:11 ID:lmGtzTS2
有効期間をもつマスタのキーをサロゲートキーにした場合、トランザクションテーブルの外部キーには何を格納すれればいいの? あとからマスタの有効期間を変更されるともう…
>>335 サロゲートキーの理解間違ってない?
普通はこうなのだけど
自然キー ○×コード+期間
サロゲートキー ID(一意の連番)
で外部キーのリファレンスにはIDを使用する。
>>330 そんなときのためにビューがある思うんだけど。
ビュー使うと著しくパフォーマンスが落ちたりするわけ?
大きいシステム作ったこと無いからわからないんだけど
338 :
NAME IS NULL :2008/03/18(火) 15:28:41 ID:o6I3pzzP
>>336 じゃあ毎回トランザクションデータの外部キーに格納されたサロゲートキーでマスタ参照して自然キーを取得、その自然キーと適用期間でマスタを再度検索してマスタ情報を紐付けるわけですか?
はあ〜
>有効期間をもつマスタのキーをサロゲートキーにした場合 この前提からしてすでに糞設計の香りが・・・
341 :
NAME IS NULL :2008/03/18(火) 20:23:49 ID:pgewhZJh
サロゲートキーとマスタの有効期間についての矛盾点について、 まともな回答が得られたことがありません… パッケージ屋は、マスタに変更があったら、 伝票1件づつ開いて登録し直せの一点張りだし ソフトハウスのPGオタクはマスタに有効期間持たせたくないとごねるだけだし…
誰がピンサロでスマタやねん
そんなに不満があるならパッケージなんか使わずに 自前で実装すればいいのに。 話からすると設計&実装のほとんどを外部に依存しているクセに あーだこーだ後から文句いうのは男らしくない。 パッケージを使うなら、脳の仕組みをパッケージに合わせろ。 それが出来ないならパッケージは使うな。
>>341 >まともな回答が得られたことがありません…
まともな質問が出来てないからだと思うぞ。
>>338 Join と サブクエリがすらすらと使えないやつはSQLを直接いじるな。
347 :
NAME IS NULL :2008/03/19(水) 06:45:22 ID:jgbHpnMh
つまりサロゲートキー推進派は有効期間という概念を理解できない奴等なわけだな。
DB板で珍しい自作自演を見たって感じだな。w
大体なにが矛盾なのかわからん。
そもそも
>>335 でサロゲートキーの意味を間違ってて、
それを指摘されたら
>>338 でようわからんこと考えてる
(joinを知らないのかな?)ので、矛盾点とかいう
発想になるんじゃないかと。
350 :
NAME IS NULL :2008/03/19(水) 09:42:33 ID:vKyZWKXy
>サロゲートキーとマスタの有効期間についての矛盾点について、 >まともな回答が得られたことがありません… どの辺が矛盾しているのかもう少し詳しく
351 :
NAME IS NULL :2008/03/19(水) 19:28:02 ID:jgbHpnMh
マスタの有効期間を後付けで変更できることで、トランデータから参照すべきレコードが変化する矛盾。
352 :
NAME IS NULL :2008/03/19(水) 19:45:51 ID:vKyZWKXy
参照すべきデータが変わるから、有効期間がついてるんだろ?
結局335はどんな回答をもらえれば満足できるんだ? 正直アホの子がダダこねてるだけにしか見えんのだが。
そもそもその「マスタの有効期間」というのが、新規登録についてなのか 参照についてのものなのか、それ次第で解は変わるだろ。 そこんとこ明示してないところをみると、本人も区別できてないんじゃないか? (あー、言ってること矛盾してるし、そんなんで作れるかよ) 「マスターに変更があったら登録しなおしてください。(キッパリ)」
355 :
NAME IS NULL :2008/03/19(水) 20:49:23 ID:jgbHpnMh
>>352 通常はそうだか、後から付帯情報が変わったりするんだよ。先物系の単価の改定だとか、締日だとか、商品名だとか…
356 :
NAME IS NULL :2008/03/19(水) 21:11:26 ID:jgbHpnMh
具体的に書くと、悩みどころは 1.自然キーの場合、 ・マスタ{Code,開始日,終了日,…} ※主キーはCodeと版数などの複合キー ・トラン{ID,日付,マスタのCode,…} でマスタの有効範囲が後から変化してもCodeが変化するわけではないから、 SELECT * FROM マスタ WHERE Code = @マスタのCode AND @日付 BETWEEN 開始日 AND 終了日 で問題ないが、 2.サロゲートキーの場合、 ・マスタ{ID,Code,開始日,終了日,…} ※主キーはIDのみ ・トラン{ID,日付,マスタのID,…} となり、マスタの有効範囲が変化すると SELECT * FROM マスタ WHERE ID = @マスタのID では誤った結果となってしまい、 上記と同じ結果を得るためには SELECT * FROM マスタ WHERE Code IN (SELECT Code FROM マスタ WHERE ID = @マスタのID) AND @日付 BETWEEN 開始日 AND 終了日 としなくちゃならんのかと…
なんで、根本的に設計が間違っていると気がつかないんだろう・・・。 ID:jgbHpnMhはマジでアホの子だと感じるが。
358 :
NAME IS NULL :2008/03/19(水) 21:44:34 ID:jgbHpnMh
じゃあ正しい設計とは?
そのSQLでは何を求めたいのかな?文章もSQLも意図が分からんよ。 サロゲートキーの例ではなぜパラメータをわざわざIDに変更するのか? 挙げられたけど説明には使われないトランテーブルの意味は? 妙に効率の悪そうなINサブクエリを使う理由は? まぁ、設計やるならSQLくらいちゃんと使えるようになってからだな。
360 :
NAME IS NULL :2008/03/19(水) 21:54:52 ID:jgbHpnMh
トランに格納されているのがマスタのIDなので、マスタ抽出のパラメータをIDにせずにどうやって紐付けろけと?
ID:jgbHpnMhは素直に外注に作ってもらうか、全うな設計が出来る人の下で 3年働いてから、このスレで質問したほうがいい。 おそらくコイツの周りの大人も辟易してるんだろうなぁ・・・。
>>360 まさか、トランをなめて1レコードずつマスタを引き当てる処理をしようとしてるとか?
おまえコボラだろw
363 :
NAME IS NULL :2008/03/19(水) 22:05:13 ID:jgbHpnMh
その結果後付けでマスタの適用期間が変わる与件が無視されるわけですか? 業務のためにデータがあるわけで、データを作るために業務があるわけではないんですよ。
364 :
NAME IS NULL :2008/03/19(水) 22:09:39 ID:jgbHpnMh
>>362 SELECT トラン情報.*,マスタ情報.*
FROM トラン
INNER JOIN マスタ
ON マスタ.Code IN (SELECT Code FROM マスタ WHERE ID = トラン.マスタのID)
AND トラン.日付 BETWEEN マスタ.開始日 AND マスタ.終了日
こんな感じで結合できるのはわかっていますが…
漏れもこの質問者はコボラに思えてきた。 つかトランって単語使うのはジジイばっかな印象あるし。
>>364 ふむ、これなら理解できる。相変わらずINサブクエリは変だけど。
それで、いったいなにが不満なの?
367 :
NAME IS NULL :2008/03/19(水) 22:27:36 ID:jgbHpnMh
INのサブクエリについてこうしないと後から期間が変更になる場合を考慮できないとおもうのですが…
ID:jgbHpnMhにいい言葉を与えよう 2chでウダウダやってる暇あったらいい外注探せ、君には理解できないから。
>>367 なるほど、ようやく意図が分かった。
トラン→マスタという関係があるものと思っていたが、そうじゃないんだな。
この場合、論理的にはCodeというエンティティが存在して、本来ならば
トラン→Code→→マスタという関係となるところが、Codeが退化して
埋め込まれているとみなすことが出来る。
「自然キー」CodeはCodeエンティティのキーであって、マスタのキーではない。
これと、マスタのサロゲートキーであるIDとは論理的に異なる。
また通常、自然キーとサロゲートキーは相互に置き換えが可能だけれども、
キー値の更新が行われる場合には結果が異なる。ここでは、マスタの候補キー
(Code,開始日,終了日)がそれに該当する。
...ということをきちっと説明できるならばいいんだけどね。
370 :
NAME IS NULL :2008/03/20(木) 00:11:26 ID:O4slGcSD
ようやく一人理解してもらえたわけですが…、この場合トランにマスタのIDを格納すべきかCODEをそのまま格納するのが正解か迷うのです。
>マスタ.Code IN (SELECT Code FROM マスタ WHERE ID = トラン.マスタのID) 唯一のキーで絞り込めば1件しか取れない、というのは理解できるかな
そもそもサロゲートキーと有効期間を両方持たすなって話だ。 サロゲートキーだけで足りないケースってのは (特殊な運用なら)あるだろうが その場合でも有効期間だけ持たせれば足りるだろ。 有効期間を持たせてるのにサロゲートキーにこだわって 無駄に難しいことやってるだけじゃん
373 :
NAME IS NULL :2008/03/20(木) 01:17:21 ID:O4slGcSD
有効期間を含めて唯一のキーで絞っていますが…?候補キーの一部(コード)だけではレコードを特定できず、物理キーに従属する候補キーの一部(有効期間)の変更が可能であるという前提が理解できないんでしょうか?
だから、これじゃたりないなら ID CODE NAME PRICE 1 A りんご 100 2 A りんご 120 3 A りんご 130 4 B みかん 500 5 B みかん 400 6 B みかん 300 これで足りるだろ、って話だ CODE FROM TO NAME PRICE A 1900 2000 りんご 100 A 2001 2005 りんご 120 A 2006 2999 りんご 130 B 1900 2001 みかん 500 B 2002 2008 みかん 400 B 2009 9999 みかん 300 後者にID持たせて無理やり使って何の意味があんの?
375 :
NAME IS NULL :2008/03/20(木) 02:00:10 ID:O4slGcSD
前者だと候補キーが存在しないのでそもそもCODEが意味を成さないのでは?入力にも使えないし… 後者については、システム統合などによるコード体型変化への柔軟な対応というサロゲートキーの謳い文句が実現できないです。
>システム統合などによるコード体型変化への柔軟な対応 いきなり話広がりすぎだろw
こんなんで >先物系の単価の改定 とかそんなシステムが作られていると思うとゾッとする
つかコイツずっと2chにはりついてクレクレ君してたのかよ。 ほんとにアホの子なんだな。
トラン(ID, マスタID, ... ) マスタ(ID, CODE) マスタ詳細(ID, マスタID, 開始日, 終了日, ... ) SELECT ... FROM トラン t INNER JOIN マスタ m ON t.マスタID = m.ID INNER JOIN マスタ詳細 md ON t.マスタID = md.マスタID AND t.日付 BETWEEN md.開始日 AND md.終了日 こんなんではダメ?
>>375 要は、サロゲートキーは他の候補キーと一対一対応していなければならないということだ。
マスタのサロゲートキーであるIDはマスタの候補キーの一部でしかないCodeとは異なるから、
トランにどっちを持たせるかによって結果が異なる。
その「サロゲートキーの謳い文句」とやらを実現するには、Codeテーブルを明示的に
用意すればよい。
自分のためにも、世の中のためにも、転職をおすすめします。
382 :
NAME IS NULL :2008/03/20(木) 10:07:43 ID:O4slGcSD
379さんが示したものに近い設計は一度やったことがありますが、やはりこれが一般的な解なのでしょうか?
今北産業,要は ID 商品ID 開始 終了 1 A りんご 2000 2002 100円 2 A りんご 2003 2004 200円 3 A りんご 2005 2007 300円 で,トランザクション側には, IDだけを持たせておけばおk? 自然キーの場合は商品IDと開始,終了期間が主キーになるよね? 何しろ期間によってキーが変わっちゃう訳だから.
384 :
NAME IS NULL :2008/03/20(木) 11:05:43 ID:O4slGcSD
後から期間が変更にならなければね…
385 :
379 :2008/03/20(木) 11:22:45 ID:???
>>384 >後から期間が変更にならなければね…
期間が変更になっても、変更前の期間をトラン側では参照したいってこと?
じゃあ変更前と変更後で別モノとして管理しなきゃいけないって事じゃん。
マスタに新規登録しろよ。
サロゲートキーだのなんだのいう以前の問題じゃん。
DB設計なんて構える前に、一度落ち着いて
物の道理とかいうレベルで考えてみれば?
変更前の期間によるマスタの紐付けを正とするならサロゲートキーが正解なんだけど?
388 :
NAME IS NULL :2008/03/21(金) 16:11:03 ID:tELGxuVg
まあ、オーダーメイドのDBなら設計ミスだが、パッケージなら「仕様」だな。 パッケージに仕様以上の事を求めてはいかんよ。選定したヤツに文句言った方がいい。 仮にオーダーしても、このテの説明してもソフト屋ってついてこれないヤツ多いけどな。
>仮にオーダーしても、このテの説明してもソフト屋ってついてこれないヤツ多いけどな。 そりゃ、Accessな案件ならともかく、DB2やSybaseなら半数はついていけるだろ。
390 :
NAME IS NULL :2008/03/22(土) 19:05:33 ID:wxTlY/NQ
趣味でデータベースをいじったことがある程度なんですが、 先日実務でいじることになりまして。データベースはSQL Serverなんですが、 客先から渡されたテーブル設計によると、Float型が主キーになってるテーブルがあるんです。 趣味レベルだった個人的な感覚では危険っぽいんですが、 実務レベルになれば普通ですか?
引き受けるのが危険
漏れも危険な香りがすると思うが、主キーという単語が出てくるだけマシなのでは? COBOLerなんかが設計すると主キー以前に正規化という単語から存在しないからな。
そもそもfloat型なんて今まで組んできた業務アプリで一回も使ったことないわけだが・・・。
>>390 主キーがFloat型
本来、整数型であるべきカラム属性が実数型になっているのか
主キーに設定されている実数型のカラム自体が、主キーとして不適合なのか
>>390 のレスを読んだ限りではわからない
>>394 そういうもんかね。
例えば「うちでは違う製品に同じ名前をつけることは絶対に無い」って保障があったとしても
製品名を主キーにはせんだろ。
なんで? 製品名がやたら長いとか、型番とかのもっといいデータがあるとかが なければ俺なら主キーにするよ。
主キーじゃないけど、以前、必要とする能力を実数で計算して算出し、 その能力値を持つ製品を探し出すというシステムで、実数型に対し WHERE句に能力値をそのまま「=」で取ってこようとしてるのなら 見たことがある。
不動小数ならいいんだけどな Floatはいかん罠
不動はいいけど浮動はダメってか?
>>397 普通は、必要以上の能力を持つ製品を検索すると思うけど、どんぴしゃの
能力でないとダメってこと?
て言うか、計算結果とデータベース上のデータが実数で合うって...
ほんとに実数が必要だったのか疑問だな。
>>399 不動 = 固定小数点 ってことだろ。
なんで?
403 :
NAME IS NULL :2008/03/25(火) 09:50:55 ID:Wyt/otDa
製品名が変わるかもしれないから
じゃあ、製品名を変える事が絶対無いと保証されてたらいいの?
>>404 わざわざ賭けに出る事ないのに
そこまでこだわる理由がわからんけど
ギャンブル好きならご勝手にというところですな。
製品名インデックスをわざわざつくるのがどーしてもいやだとかw
キー以外のインデックスを作るという意味でね↑
>>405 意味のない議論してるからだろ。
「製品名」を「要件」に置き換えたら、あらゆるものを否定できるぜ。
>>408 主キーが主キーたるには3つの条件があってだな…
>405は常識的な話をしてるだけだろ 常識的じゃないけど「絶対に製品名は変わらない」って前提があるなら>404もありだと思うが 大抵そんな前提は崩れるもんだけどなw
また、サロゲートキーの流れか? せっかく話題変わったとおもったのにw
論理学の問題だよ。
「Xという前提でYが成り立つか?」という話をしているときに「そもそもXが成り立つか?」
という話をごっちゃにしたら混乱するのは当然。
しかも
>>410 はトートロジーだし。
それと、「商品名」が変わるかもしれないと考える理由は何なのかな?
これが「製品コード」とか「ビールジョッキ」だったとしても同じように思った?
>>412 思ったね。製品コードなんかが「変わらないもの」って
雰囲気がある分だけ一番やっかいだ。
書籍関連のシステムやってたけど、
ISBNの13桁対応だって結構な仕事だったんだぜ。
これがキーだったら死んでたよ。
お客さんの「絶対」なんて信用できないでしょ。
結局変更があるかどうかの確率でしか話ができない。
なら余計な賭けに出るより、安全な方法を採るのがいいじゃん。
ギャブル好きならご勝手にどうぞってのはそういう事です。
論理学の問題?バカ言え、
>>411 のいう通り、
サロゲートキーの話を蒸し返してるだけだよ。
一意、必須、永続を満たさないものは主キーたりえない。 これはDB設計の入門書レベルの話。 製品名にそれが当てはまるかと言えば、そんな保障は無いといわざるを得ない。 例え客が「製品名は一意です」「必須です」「永続です」と言ってもだ。 結果として一意で必須で永続かもしれないが その可能性に掛けるようなばくちを打つのは愚かだといわなければならない。 だからどこのシステムでも製品名を主キーにしたりせず 別に主キーを設けるわけだ。 サロゲートキーの話か?とか 商品名が変わるかもしれないと考える理由はなんだ、とか あまりにレベル低すぎ。
>>413 客が言ってたらいいんじゃん。
製品名が変更になったら、「仕様変更」で受注すればいいだけだし。(w
>>416 そうそう、お主も悪よのうパターンもあるんだよな。
まあここは設計を語るスレだから、営業的側面は取り敢えず
おいとくってことでw
結論 客相手ならそのままGO! 自社用開発ならやめておけ
>>414 別の候補キーを選択するってのならわかるが
別に主キーを設けるって、それ代替キーだろ
つまり、サロゲートキーの話じゃん
自分で自分のレベル低すぎって言ってるぞw
製品名を主キーにする話にすりかわってしまったが
もとの話は、390のFloat型が主キー・・・という話だったよな
俺は客相手でも嫌って言うけどなw それでも名前でやれって言われれば渋々やるだろうけど
421 :
NAME IS NULL :2008/03/27(木) 17:29:02 ID:MVf/TxMn
>>418 客相手でも自社でも、代替キー使うだろ。
製品名が変更になったら、
1.何にもしないで「仕様変更」で金だけもらう
2.無料で対応しますと恩に着せておく
その時の状況でどっちでもイケるだろ。
結論:製品名は主キーにしない。
卑しいな
ナチュラルキーとサロゲートキーの違いが分かってない奴がいるな
>>419 入門書を読むか、最低でもネットで検索してみることをお勧めする
最近サロゲートキーって単語を覚えたらしい厨房がウザいな。
春だねぇ・・・
サロゲートとか言うから、文字コードの話かと思ったらシステム側で 振った連番のことね。 なんか最近昔からある技術に新しい名前付けるのがはやってるのか? Ajax とか Web 2.0 とか、なんだかなぁ...。
>>428 いわねーよ、ばーかw
ひっこんでろwww
そんなに昔ではないにしろAjaxほど最近ではないと思う。 でも実際に仕事じゃあまりいわないなあ。 なんか気取ってるみたいでこっぱずかしくって。
代理キーの英語名称をそのままカナ読みしただけのもの。概念自体は古くからある。
あのさぁ、「概念自体は古くからある」なんて事じゃなくて、 「SQL89に定義されていたがSQL92からは実装されている」とかの具体例のソースをだせよ。 でなきゃ、「昔からある」なんて誰も認めない。
なんだSQLの機能のことと思ってるのかよ。 代理キーというのは関係モデルの概念で主キーとしなかった候補キーのことだぞ。
>>430 この程度の人間が耳にしたのはごく最近(このスレが初?)かもしれないね。
アフォか。 じゃあ、その「関係モデルの概念」がANSIとかで公文書(?)として制定されて エンジニアが実装しはじめたのはいつなんだよ? どこぞの国の特許じゃねーんだから「概念は昔からある」と主張して 「おまいらそんな事も知らんのか?プププ」とか一人で主張しているアフォにしか見えん。
そろそろ「サロゲート」を禁止文字にすべきじゃないのか?と思うが。 サロゲートバカが粘着してウザ
サロゲートが信仰だということが分かる良スレですね
なんかちょっとおかしい人が混ざってますね。 話にならない。
そもそもは
>>390 の「主キーがFloat型」という話だったよね。
>実務レベルになれば普通ですか?
普通ではないし、止めた方がいいでしょう。
せめて固定小数点。
できれば別途ID(代替キー、サロゲートキーとか呼び方はいろいろあるけど)を付けるのが扱いやすいです。
設計した人が「よく分からないけど大は小を兼ねる」「でもなんとなく倍精度はもったいないかも」みたいな酷い理由でFloatになっていることも有り得るので、そのカラム自体がFloatである理由を聞くといいと思います。
>>412 ,427,430,433,436
このあたりは同一人物?
転職した方がいいよ。
都道府県マスタを作るときに 1:北海道 2:青森県 : : てな感じで都道府県コードが1からの連番で登録したとする。 >396は「俺なら都道府県名を主キーにする」 >414は「都道府県名を主キーにしたりせず別に主キー(都道府県コード)を設けるのは基本」 >419は「別に主キーを設けるって、それ代替キーだろ。つまり、サロゲートキーじゃん。」 って感じか? 「都道府県コードの変更が怖いから別にサロゲートキーを付加する」とかはナンセンスだと思うが
代替キーと、代理キーを同じだと勘違いしてるのがいるかもな
代替キーってのは、別途新たにつけたキーで、Surrogate key
代理キーってのは、
>>434 のとおりで、Alternate key
まぎらわしいから、サロゲートキーと言う表現は禁止がいいかもしれん
Artificial key とか、Alias Key ともいうし、
人造キーとか、人工キーとかのが間違えなさそうだ
自然キーに対する言葉として人工キーというのが一番しっくりくる。
>>442 その例で、「都道府県コード」をシステム側で付番してるなら、
それが人工キーと言ってるやつなんだが・・・
既に人工キー付けてるのに、更に追加するのは、俺もナンセンスだと思うがな
都道府県名に都道府県コードを付けるとして その都道府県コードが外部(ユーザー)から認識されるコードなら 人工キーであっても立派な主キーなんだよね。 代理キーはむしろ都道府県名になるはず。 逆に都道府県コードがテーブル間の関連でしか使わないものならそれは代替キーとなる。 さきの商品名の話しでは、 商品名を主キーにするか別に商品コードを付け主キーとするかというのが第一の問題で、 外部(ユーザー)から認識されない代替キーをつけるかどうかは本質的な問題ではない。
正直「それはサロゲート」と喚いているヤツは主キーすらまともに理解していない気がするな。 商品名の話で「商品名が主キーで、IDがサロゲートキーです!」とか ヌカすアフォがいたら漏れは即効で設計・開発からソイツを除外する。
そもそもサロゲートキーって概念はDB設計じゃなくてシステム設計な気がするな サロゲートであろうとなかろうとDBとしてはPKになるわけだし CUIのシステムだとコード値はユーザに公開しないといけない情報だから自然キー GUIのシステムだとコード値はユーザに公開する必要ないからサロゲートキー(と呼んでも問題ない) って感じかね
>>442 JISで定められてる都道府県コードでも
俺は主キーにはしないなー。
気持ちはわかるんだけど、
他のテーブルについて、恣意的なコードは変更可能性があるから
主キーとしてIDを設けるけど都道府県に関しては別、とか
いちいちルールがごっちゃになると嫌なので。
これは主キーの三大原則うんぬんじゃなくて、
運用上のルールにすぎないけど、ルールはひとつの方がいい。
都道府県コードだろうが、ISO標準の何かのキーだろうが主キーにしない
ただのセカンドシステム症候群だな YAGNIって考え方を覚えたほうが良い
DB設計について色々悩むことは多いけれど、主キーについては「全てID」で自分達としての答えが出たよ。 多対多の関連テーブルやログなんかも。 迷いがなくなったのはとても大きい収穫でした。
主キーの三大原則とか、わけかわらん 主キーとは、候補キーより設計者が、主に使用すべきものとして 任意に選定して決めるもの 候補キーは、リレーション中でタプルを一意に定められる属性の集合で、 冗長な属性を含まないものだ 理論上の定義と、実務上の経験則を一緒にしたらいかんと思う 他システムの情報で、他システムの人工キーは、 自分の所にもってきたら、自然キーと認識する 規格で決められたコードなんかを、主キーにする場合はこれにあたる この場合、自分のシステムの外から与えられる情報からなる候補キーより 選択した主キー=自然キーと考えるからだ つまり、元情報にない情報で、人工的に自らが追加したキーと言う考えが 人工キーであり、他所からもってきた情報は、人工キーではない 主キーを選定する段階で、 1)与えられた情報での候補キーから選定する 2)与えられた情報での候補キー以外に、新たに人工キーの候補キーを追加する 3)候補キーが存在しないので、新たに人工キーの候補キーを追加する 2)と3)は話が違くて、3)のケースでは、あんまり問題にならんだろ 2)のケースで、追加する派と、追加しない派がいるって事だと思う 個人的には、次のケースでは、人工キーを検討する 絶対使うわけじゃないが、検討はするってカンジ ・候補キーが複合キーで属性が多く、全体に冗長になるヤツしかない時 ・システムライフが尽きるまえに、属性変更が加わる可能性がある時 ・他所のシステムの人工キーが、候補キーの時
>>453 > 個人的には、次のケースでは、人工キーを検討する
> 絶対使うわけじゃないが、検討はするってカンジ
> ・候補キーが複合キーで属性が多く、全体に冗長になるヤツしかない時
> ・システムライフが尽きるまえに、属性変更が加わる可能性がある時
> ・他所のシステムの人工キーが、候補キーの時
こういうことをいちいち検討するコストを考えたら
俺は全部IDの方がいいや。長々とおつかれさん。
どーでもいいが、この長文クンは実際にシステム組んだ事あるのかな? なんか春休みの宿題でもやってそうな気がするが。
>>451 セカンドシステム症候群は
あるかどうかわからない後々のために
余計な手間をかけるから悪い。
全部IDにするのはなんの手間もないのでちょっと違う。
O/Rマッピングとか実装を考えても楽。
全部IDもいいんじゃね? DB設計に金払ってもらうから、検討するんだし 金払ってもらえない会社は、検討しないってより、できないが正しいな
O/Rマッパーを使う事が前提ならマッパーが使いやすい様にID振る方針に する時もあるな。 ただ、SQL直書きする方が効率がいい場合は普通に設計する。 システムにもよるが全部ID振るアフォを見たらクビにするが。
>>458 >SQL直書きする方が効率がいい場合は普通に設計する。
その場合でもIDの方が楽なのですが。
>全部ID振るアフォを見たらクビにするが。
全部IDではいけない理由って何だろう?
>>SQL直書きする方が効率がいい場合は普通に設計する。 >その場合でもIDの方が楽なのですが。 それは喪前がSQLを知らないか現実の仕事をしたことないからだろ。 SQL直書きの方が効率がいい集計や分析ケース明らかに存在する。
>>460 >SQL直書きの方が効率がいい集計や分析ケース明らかに存在する。
話がずれてるね。
「SQL直書きする場合でも、自然キーよりIDの方が楽だ」と書いたのですが。
>>460 SQLどころか日本語が不自由みたいだなあ。
IDだとSQL直書きの場合不利な点ねぇ・・・。
JOIN句を見て直感的に業務モデル上の
関連が想起しにくいって事くらいかねぇ、考えられるの。
実際にSQL直書きで仕事してみるとこんなの
だからなに?ってもんだけどな。慣れの問題なのかな。
JOINくらいしか連想できない自称SQLで仕事している厨房はそんな発想しか でてこないんだろうなぁ。 それか「その場合でもIDの方が楽なのですが。」程度の仕事しかしてないんだろ。
Web系なユーザー登録とかショッピングとかそういう簡単なデータの読み書きしかやらないヤツと集計・分析やるヤツとは要求されるレベルが遥かに違うから話はあわんだろうから、そこそこにしとけ。
分析時の話と、物理設計時の話とで齟齬が生じているような気もします。 集計・分析をする高いレベルにおられる方に、IDのデメリットをお聞かせ願いたいです。
>>465 この話するとたいがい論理設計の話と物理設計の話がごっちゃになるんだよ。
もう仕方ないね。それはさておき今はどうやら物理設計の話みたいだよ。
UNIONつかいまくりクロス集計つかいまくりの
管理会計帳票担当だった俺でもID使わない理由がわからんなあ。
>>463 も悪口言う前にメリットはこうだーまいったかーとか
書けばもっとみんなのためになるやりとりになると思うんだけど。
よろしくお願いします。
まあこういうのは煽ったら負けだよ。
がんばれ
>>463
>>463 こんなレスをみると、「全部IDで」という方向は間違ってなかったんだなあって思います。
ID無しのメリット ・ストレージの節約。 ・カラム数の節約。 ・JOINしたテーブルを*で見たときに見やすい。
*
>UNIONつかいまくりクロス集計つかいまくりの >管理会計帳票担当だった俺でもID使わない理由がわからんなあ。 UNIONが完全悪と言うワケではないが、UNION使いまくるSQLを組む時点で、 あまりSQLと言うかデータを集合で扱うのが苦手なんだと思われる。 そして「ID使わない理由がわからん」と言う時点でテーブルの設計がアレなケースか 利用者が勘違いしているケースが多い。 現実問題として実装する段階でオブジェクト指向な言語(Java)とRDBMSの理念は相性が悪い。 それをある程度軽減する意味でO/Rマッパーがあったりするが、 単純なCRUDならともかく、集計・分析になるとO/Rマッパーで実装する方が 手間がかかる上に、実行速度が遅くなる。 たとえば、銀行の各科目残高の積数・平残を意識した報告書をJava&O/Rマッパー+IDなテーブルと 普通設計DB+統計情報+マテリアライズ照会を使って実装するのとでは後者の方が生産性が高く 学習コストが低く、実行速度も速く、間違いや修正もすばやく対応できる。 そしてこの手のテーブルは複数のカラムを組み合わせてデータの一意性を確保しているので 「なんでもID」ってのはヴァカのする事で、むしろ実行効率が下がる。 道具や理論は効率的に使い分けるべきで、「なんでも○○」はお勧めしない。 言っとくが漏れも「商品名を主キー」は反対派だからな?w
>>473 IDなテーブル+統計情報+マテリアライズ照会だったらどうなるんだろう
分離設計進んでてO/Rマッピング使ってたりすると、 集計・分析段階でUNION頻度増えると思う。
>>474 IDなテーブルだとカラムのドメイン定義がダラダラだろうからSQLといっても
ストアドになるだろうからマテリアライズできない、もしくはSQLがかなり助長となる。
そのストアドで動的SQLになっていたら統計情報使われるか微妙。
結果カーソル回しまくりのCOBOLな泥沼ソースが出来上がり保守性落ち、
学習コストが上がり、実行速度がO/Rマッパーよりはマシだがマテリアライズよりは落ちる。
確かにO/Rマッパーって学習コストが半端じゃないからなぁ。 SQL文だけならAccessでも仮実装可能なので敷居が低いし。
どうしておまいらいちいち極論に走りたがるんだ……。 要件に応じて使い分けりゃいいだけだろうに。 原理主義者が一番タチが悪い。
糞と組んだときの、ただの経験談っぽい
> IDなテーブルだとカラムのドメイン定義がダラダラだろうから この前提がなあ。
むしろIDともう2、3カラムしか無い設計とか好む
IDを使うのは物理設計の話なので、カラムのドメイン定義がダラダラかどうかには関係ないですよ。
誤解があるよね。 ID派(としてしまうけど)は、なんでもORマッパー経由でホスト言語でこねこねするだとか、必要な一意性制約を洗い出さないだとか。
O/Rに勉強コストとかいってる奴が設計語ってんなよ しかも今時ストアドって・・・
>>476 何重にも仮定を重ねてまったく意味の無い文章になってるな
SQLでOOPとのギャップ解消するほうがよっぽど難しい
なんにせよ「漏れ」はないよなって話
全部IDで問題ないという確信が深まりました。 みなさんありがとうございます。
>>473 O/Rマッパーうんぬんじゃなくって
SQL直書き+IDの場合のデメリットが
いまいちわかりませんなー。
>>474 さんへのレスをお願いします。
あとO/Rマッパー、一般論だとおっしゃる通りの弊害があるけど
JavaだったらiBatisとかS2Daoとかあるから。
SQL書きたい局面なら書けばいいじゃんっていう。
これは一般的なマッパーってわけでないので、ご参考までにという話。
UNIONはね、使いまくりってのは言いすぎだったよ。
使うのに抵抗ないくらいSQLは書けるよと言いたかっただけ。
これは俺が悪かったです。すまんこって。
なんというか一人が自作自演しているのがバレバレなスレですな。 しかもレス乞食かよ。 なんにしても「全てIDマンセー」以外の意見は認めない厨房なんだし レスするだけ無駄だな。
>O/Rに勉強コストとかいってる奴が設計語ってんなよ >しかも今時ストアドって・・・ こういうヤツの典型がホスト言語(特にVB)で実際コネコネしまくるんだよな。 であげく「テーブル設計が悪い!」と愚痴る能無しが多い。
>>490 >>493 は銀行の情報系の分析を例に出しているのだが、あの情報は
「複数のカラムで一意性…」と説明しているのにID制を使う理由が逆に解らん。
つか無駄だろ。
喪前は勘定日付・作成日付・支店コード・科目コード・口座種目・残高、etcとあるテーブルに対して
IDを割り振ってナニするつもりなんだ?
ここからID付けて前月末残高や平残求めるクエリ流すのにIDがドコで使われるんだ?
金融系なのだとしたらさらに前期末やら年度末の集計・分析が入るんだがIDでどんなメリットがあるんだ?
そんな魔法のクエリがあるなら教えてください。おながいします。w
>>493 >>473 の間違いだよね。
473の内容は
・O/Rマッパー+ID
・直書きSQL+自然キー
で比較して、後者の方が生産性が高く学習コストが低く・・・・って
やってるから、O/Rマッパーの弊害の説明になっちゃってますよね。
そうでなくて、同じ条件においてIDと自然キーを比較して、
IDのデメリットを説明してほしいだけなんですよ。
ヴァカとか能無しとか言いたい気持ちもわかりますし
たぶん俺はそうなんだと思うので、それはごめんなさいしますので
心を落ち着けてよろしくお願いします。
せっかくのスレタイに沿った話題ですので。
で、「全部ID」にする意味は、ルールは単純な方がいい、ってのが大きいです。 だから、原理主義と批判された方も居ますが、 原理主義ってより、現実解って方が近いですかね。 細かにパフォーマンスを計測すると数字上不利な場合など あるのかも知れませんが、体感速度に現れなければ問題ないですし。 細かいパフォーマンス気にしてややこしい事する方が チューニング原理主義と呼べそうですね。 無駄というのも、IDのカラム分ディスク領域を消費するとかって話なのでしょうか。 コスト感覚が私とちょっと違うみたいですね。1TB超えHDDが2万切ったらしいですね。 私は、1つ1つのテーブルに対して、O/Rマッパーとの兼ね合いも考えつつ IDにするか、自然キーやその複合キーにするか検討するコストを無駄と考えます。 もしIDだと大きな弊害がある場合があるならそのテーブルだけ IDじゃなくするってのにはやぶさかではありませんが 幸い受発注から債権・債務などの管理会計までやって 困った事はないですね。幸せもんなのでしょうか。 ちなみに金融系はやったことないです。
マスターの変更履歴を残すのってどうやってる?履歴テーブル作って トリガーで挿入?それともマスターのキーと日付をペアでキーにして 最新を参照してる?
>>492 > こういうヤツの典型がホスト言語(特にVB)で実際コネコネしまくるんだよな。
> であげく「テーブル設計が悪い!」と愚痴る能無しが多い。
こういう連中を相手にしてたらイライラもするだろうけど。
金融系も
>>495 で困りません。
統一性ってシステム作る上で大事な事じゃね?
>>495 いろいろとツッコミたいトコロがあるんだが。
>細かにパフォーマンスを計測すると数字上不利な場合など
>あるのかも知れませんが、体感速度に現れなければ問題ないですし
だからID振ってテメエでJOIN時のパフォーマンス図ってみろ。
金融系の過去2年分をやれば明らかに差がでる。
>細かいパフォーマンス気にしてややこしい事する方が
>チューニング原理主義と呼べそうですね。
IDでJOINする方がややこしくなると言っているんだが、盲目か?
ついでにあの例で魔法のクエリ(w)書いてみろ。
>コスト感覚が私とちょっと違うみたいですね。1TB超えHDDが2万切ったらしいですね。
世間知らずのアフォか。
じゃあIBMの鯖のDisk装置は35GBで30万するぞ。
壊れてもいいパソコンヲタのコスト感覚とミッションクリティカルな業務のコスト感覚を
一緒にするなよ。
最初からID原理主義者はおもちゃ業務前提だったら好きに作ればいいが、
「データベースは全てID制」トンチキな持論展開するな。
>そうでなくて、同じ条件においてIDと自然キーを比較して、 >IDのデメリットを説明してほしいだけなんですよ。 なんでこの人は上から目線かつ自分で試さないんだ? それぞれの業務によって合う合わないがあるから 取捨選択すればいいのに。 ホントにクレクレ厨房がプロに噛み付いているだけにしか見えんが。 このスレ読んでメリット/デメリットが理解できないならこの人は設計すべきじゃないと思うな。
>>499 金融系過去10年分使ってますが・・・問題ないです。
35GBで30万するHDDとかも使ってません。
なんか色々すいません・・・
>>493 それをO/R真っ裸ー使うときにはやっぱりID振りますか?
496が完全に埋もれてて可哀想だね
496乙
>>491 >なんというか一人が自作自演しているのがバレバレなスレですな。
>しかもレス乞食かよ。
自己紹介どうもです。
結局サロゲート厨は例の問題のSQLかかないと、持論の正当性を証明できないと思うが。
俺もあのテーブル設計でどうやってID使って結合させるのか興味あるがw
「速度は十分です」「金融系10年」なんて脳内発言よりも現実解を見せて欲しいモノだ。
>>496 >マスターの変更履歴を残す
なんの為に変更履歴をとるのかハッキリしとかないといけないと思う。
不正アクセスなコンプライアンス的な意味ならジャーナルでいいと思うが。
>>501 Oracle8の時代ってさ、統計情報はないしSQLのオプティマイザがバカで
人間がアレコレチューニングしていた時代のRDBじゃね?
#式の評価は左からとか・・・。
今はコストベースでSQLエンジン動くから普通にSQL書いても
速度的に問題になるケースは少ない。
OracleもIBMもそう発表しており「プログラマーが変な事スンナ」と発表していたが。
その資料は嘘じゃないけど、現在から見るとどーだかなー、な感がある。
元々の例になってる奴ですけど、見たところ残高ってあるから、 本来売掛買掛ほか諸々をを集計して導出できるのを、 パフォーマンス対策でテーブルにしたって感じですか。 確かにこういったデータにID振っても、殆どの用途は集計・分析だろうから 誰もID見ないよね。他のテーブルの外部キーにもならない。 だから無駄ってのは判ります。魔法のクエリなんてありません。 他には、多対多を実現するための関連テーブルにIDは要るかって議論もある。 これも誰も見なかったり外部キーにならない事が多い(時々あるけど)。 実はだれかこのつっこみしないのかなあと待ってたんだけどw で、これはこの場合だからIDでこっちのテーブルは自然キーで、 って考えるの面倒でしょう?あとO/Rマッパーとの兼ね合いもある。 JOINのコストですが、こちらは販売から管理会計までですが、 仕訳の明細単位でレコード作って、えーとあれは前の前のワールドカップだから 2002年ですね、稼動し始めて、今の所大丈夫ですねぇ。 特に商品売買損益計算書が不安だったんですが(商品の種類の数が尋常じゃなかったんで)普通に動いてます。 一応都内一等地にでかいビルが建ってる商社の子会社さんなので 結構な取引量だったんですが。 でも2年で遅くなるって金融系って凄いですね。 これは門外漢でしたが、私の了見が狭かったですね。 どうも、生意気言って済みませんです。
>>509 なんでO/Rが絡んできてるのか未だによくわからんのだけど、ほんとに使った事あるの?
O/Rでview使わないで他方式ではマテビュー使うとか473なんて明らかに・・・
金融+分析だと最低5年位データが無いと分析信頼度が得られないってエロイ人が言ってたよ。
貧弱なテスト環境でも確か3年分(足りてないのは諸事情ありw)使ってた。
金融系でDB2使ってる所ってあんまり聞かないなぁ・・・
普通は選択肢にも上がらないから調べてみるか。
そもそも残高の管理単位なんか変更になったら作り直しだろ?
512 :
NAME IS NULL :2008/03/29(土) 18:16:43 ID:M4L278l8
なんだかレベルが違うんですね...。
自分のようなショボい段階と金融系を扱うような凄い人達では、ちょっと言葉も通じてない感じです。
ってか、アレだなあって思います。
>>509 自分の扱うシステムは大した事ないので、関連テーブルでもなんでも、使われることがないであろうIDを付けます。もう機械的に。
俺も関連テーブルでもID付ける 関連も何かの個であったりするし特定楽だし
>>510 >なんでO/Rが絡んできてるのか未だによくわからんのだけど
商品名みたいなカラムを主キーにしていいじゃん
↓
そりゃないだろう、お客さんが変更がないといっても信じられないし
↓
そこから話がサロゲートキーの話なる
↓
IDにするメリットはなんだ?
↓
O/Rマッパー使うとき楽だし
という流れがあったから。
>>512 金融でも色々みたいよ。
高いハードでそろえなきゃいけないプロジェクトもあるんだろうなあ。
ミッションクリティカルか否かとは別の次元の理由で。
そう考えると確かにID追加する事によるストレージのコストにも
敏感になるのも理解できます。
>金融系でDB2使ってる所ってあんまり聞かないなぁ・・・ 銀行やカード系では普通にiSeriesと言うかAS/400が生き残っている。 昔結構売れたからな。コレ。 ホストがzSeriesなので営業的に情報系のサブシステムとして iSeriesを使うトコはそこそこある。最近減ってるけど。 まあ、ココはココでCOBOLerが横長DB作りたがるので本気で 内容のレベルはピンキリだが、やってる事がかなりクリティカルかつ データ量はハンパじゃねぇ。 しかも値を何回も変更してシミュレーションを行うので、 処理が速いほど行員の睡眠時間が変わってくる(w)し、 行員が理解しやすく編集しやすい形で提供する必要があるので、 一エンジニアの自慰理論は却下される。 まあ、ここらの金融機関の予算を決める部署の行員は正直そこらの プログラマーより遥かに頭がいいので、アフォな設計をすると「ナニそれ?おかしくね?」 とツッコミがはいるから安心汁。
516 :
NAME IS NULL :2008/03/29(土) 19:52:24 ID:M4L278l8
単純に結合のコストだけでいうと、整数なIDは自然キーよりも優れていると思います。 自然キーだと結合しなくてもよくなることもあるので、シビアな業務ではパフォーマンスに優れるでしょう。(非正規化してパフォーマンスアップと似た意味合いになりますね) ID自体のディスク占有は、ケースバイケースで、大抵の場合は問題にならないと思います。複合外部キーがなくなりますし、逆にサロゲートキーの利点として「ストレージの節約」が挙げられることもあります。 ただIDを採用するとインデックスが増えるので、その影響はあると思います。 515のような人がまともにやれているようには思えないのですが、そういう世界もあるのでしょうし、なにも「全世界の主キーをIDに!」なんて言わないので安心して下さい。 多分515から得られることも(技術的に本当に515が優れているとしても)ないでしょうし、これで自分は終りにします。
スレたって1年で200レスしかいかなかったのに 今回はすごい盛り上がりだったなw
>515のような人がまともにやれているようには思えないのですが、そういう世界もあるのでしょうし、なにも「全世界の主キーをIDに!」なんて言わないので安心して下さい。
>多分515から得られることも(技術的に本当に515が優れているとしても)ないでしょうし、これで自分は終りにします。
凄い上からな物言いだな。
サロゲート厨の「ボクが正しいんだ!」ってダダこねてたじゃん。
>>518 まあ、粘着&自作自演のサロゲート厨がレスの半分以上占めてた希ガス。
固定長レコードすら使ってない俺はパフォーマンスの話題には加われない
521 :
NAME IS NULL :2008/03/29(土) 21:02:02 ID:M4L278l8
恥ずかしながらまた書きこんでしまいますが
>>519 >サロゲート厨の「ボクが正しいんだ!」ってダダこねてたじゃん。
そこがまず誤解というか妄想で、そのために話になってなかったのでしょうね。
>>517 もちろん違います。ただの末端孫請け土方プログラマです。
そういえば羽生さんと渡辺さんが議論してたときもなんか噛み合ってなかったですね。
どうせ過疎板なのでみんなsageないでもよかったですね。
>>521 違いましたかw 失礼しました。
けんかがとても上手なのでそうかとww
羽生さんと渡辺さんは噛み合ってなさそうで設計と実装の違いって感じで、
あまりぶつかってなかったように思えました。設計と実装で
上手い事切り替えられる記法があれば無問題な話だったように思います。
それに比べて今回のやりとりはなんだか一方的な煽りが多くて、並べちゃ悪いです。
ダダこねにしろ上からな物言いにしろ どっちかというと、どっちかというとだけど ID否定のお兄さんの方が当たってると思うけど。
ちょっと相談に乗っていただけないでしょうか。 社内ユーザ向けの質問・障害受付の過去事例検索システムを 作ってるのですが、なかなか良いフィールド名が思いつきません。 必要なフィールドは下のとおりです。 ・発生日時(DATE) ・件名(TITLE) ・内容(NAIYOU) ・対応(TAIOU) ・種類(CATEGORY) ・質問者(仮)(思い浮かばず。エンドユーザ側担当。依頼・クレームなど質問とは限らない。) ・受付担当者(UKETUKEにしようか思案中) すでに決めた分についても、もっといいのがあれば教えてください。
>>515 iSeriesかぁ・・・そういわれればあったね。
でも使ってる所って大概・・・
しかしiSeries使ってるからクリティカルって妄想甚だしいなw
あと言っておくと金融機関の予算決める部署が自部署要件以外で開発に関わる事は無いよ。
奴等は自己防衛の塊だからリスクのあるところ(開発)に口出したりしない。
まぁ、頑張ってくだちぃ
>>524 作らなくてもBTS使えばいいのに・・・
>>524 なんとなく決定済みのカラム名見てると
いっそ全部日本語ローマ字表記の方が
保守しやすいと思う・・・・。
529 :
NAME IS NULL :2008/03/29(土) 23:15:46 ID:M4L278l8
>>524 これもいろいろ流派?があるでしょうが、自分は大概ローマ字にしています。
オフショアなどで外国人が開発・保守に関わる可能性がない限り(というか自分程度ではそんなこともほぼないので)。
いくつかXXX_DATE, XXX_NAME, XXX_NO, XXX_TELなど一部使用する英単語は規約で決めておきます。FAXなどの外来語も。
なので
・発生日時(HASSEI_DATE)
・件名(KENMEI)
・内容(NAIYOU)
・対応(TAIOU)
・種類(SYURUI)
・質問者(SITUMONSYA)
・受付担当者(UKETUKE_TANTOUSYA)
ダサいけど名前付けに悩むこともなくなります。
>>529 ローマ字にした場合、ヘボン式で統一とか
決めないと結構難儀しますよね。
私の案件では英語にしてました。
逆に英語にした場合の弊害というと、女性がいるチームで
性別ってカラムがあった場合にやりとりに困るのがなあw
531 :
NAME IS NULL :2008/03/29(土) 23:27:07 ID:M4L278l8
>>530 そうですね。自分は訓令式の方が統一性があるので、そちらにしています。
英単語だと名前決めにワンクッションあって、しばらくして忘れてしまって、意味をまた調べ直して。
日本独自の言葉も上手く変換できずにそこだけローマ字。
それならっていうことで、「全部ローマ字(笑)」にしました。
自分達程度の英語力で頭をひねったところで、ネイティブには通じない変な単語を使っちゃいますしね。
>>530 >逆に英語にした場合の弊害というと、女性がいるチームで
>性別ってカラムがあった場合にやりとりに困るのがなあw
あるあるw過敏に反応されるから恥ずかしくなるw
>>532 性別の件を見てあえてすべての項目英語に統一したくなったオレはセクハラで訴えられますか?
534 :
NAME IS NULL :2008/03/29(土) 23:45:37 ID:M4L278l8
>>527 面白いですね。自分も感化されました。
今、改めて見てみると、コメントの通りすがり氏になんだか既視感を覚えます。
「あれ?この人。。。」
>>533 xxxmanCodeってカラムがあった事がありました。
声に出すたびに「xxxマン・・・コード」
・・・意識してなかった分恥ずかしくなったわw
ところでDB設計ツールでオススメとかある? 今はObjectBrowserERか、JDeveloper、EclipseのAmaterasERあたり使ってます。
>>538 ObjectBrowserERあるならそれでいいんじゃない?
EAはDB設計だけ使いづらかった気がする。
金ないならDBDesignerとかあるけど開発停止してるしな・・・
ObjectBrowserERは日本人好みの定義書が吐けるのがいいよね。 DBと同期とるとなるとOracleとPostgres限定になっちゃうけど。 記法もIDEFとIEなのがいい。DBDesignerやToadとかフリーの奴って なーんでかヘンな記法なんだよねぇ・・・。 所詮記法なんだけど気分が乗らないw
Toadは使ったこと無いけど、DBDesignerは記法を選べるよね
ほんげーそうなんですか?知らなかった・・・。 あのひし形がどうも好きじゃなかったんだよなー。 チェンのERDを意識したのかな。 Toadは三本足なんだけど、エンティティが どっちかというとUMLのクラス図ぽかった。
543 :
527 :2008/03/30(日) 03:49:35 ID:???
>>534 やっぱりそう来ましたねw>既視感
でも、私は楽器板にも顔出すんですが、
煽る人ってみんな同じですよ。すごく似てる。
はぶさん、けんか上手いですよね。
というか、煽りに対して余談とはいえデイトやらラルフ・キンボールやらまで引いて
こんだけ徹底的に相手するって、大人げないよなあw
外野はとても勉強になったんで煽り様々ですが。
この妄想バカは書き込みやめると言って朝から晩まで2chに張り付いていたのか? しかし、都内一等地やら不思議な芸暦を聞かれてもいないのに語ったり、 2TB1万円切りましたとかのパソコンヲタがメインフレーム・ホスト・オフコン屋に 机上の空論で噛み付いてたりして不思議なスレになったな。
545 :
527 :2008/03/30(日) 09:37:14 ID:W6kVMddH
>>544 おはようございます。実は録画しておいた
とことん石ノ森章太郎見てたらあんな時間に。
おはずかしいww
煽りをスルーするととてもためになるお話でした。
特に行員の睡眠時間に関わる、とかちょっと面白いし
世の中ちょっとしたパフォーマンスの差も
ちり積もでそこまで影響するくらいのトランザクション量を
考えなきゃいけない世界もあるんですねぇ。
書き込みやめると書いてた方と自作自演みたく
思われると先方に悪いのでsageるのやめときます。
sageてもID出りゃいいのに。IDって面倒ww
お前ら落ち着けよ。
くだらないネタでageるのは大人気ないぞ。
スレ内容に関して質問があるときにageのはともかく
煽りでageるのは子供のする事だ。
>>545 は半年ROMっとけ。
だいたい見てると、どちらかと言えばID否定派は煽り口調ではあるが
現実的な例を持ち出して「適材適所で使い分けろ」と言っているだけなのに、
サロゲート信者は丁寧口調ではあるが「統一ルール。メリット・デメリットが解りません。
ボクのやってきた仕事では大丈夫でした。オマエのトコロが異常」と
現実的な面が見えない例をだし議論にならん展開をしていて、
相手を見下しているから荒れるんだろ。
どっちもどっちと思うが、信者はウゼーよ。
547 :
NAME IS NULL :2008/03/30(日) 10:25:00 ID:8S8b6WfW
ID厨はうまくスルーしてたと思うよ。 特に持論に都合の悪い発言に関しては。 それを妄想と思いこむあたり病気か?っておもったくらいだ
548 :
NAME IS NULL :2008/03/30(日) 10:44:29 ID:W6kVMddH
>>546 いやいや、先方も「ボクの所ではそれではダメです。
お前のところがオモチャ」とおっしゃってますし
お互い様だったかなと思います。
適材適所はごもっともなんですが
その適所ってのが、金融系未経験の私の感覚だと
特別な感じがするんですよね。
それがすれ違いの元で。それは反省してます。
でもこのネタ、面白かったですよ。下らなくない。
IDでうれしい事、RESTのリソース指向アーキテクチャとの
親和性が高いってのもありますね。これまた世界が違っちゃって来ますけど
そういうオモチャな世界もあるってことで。
捨て台詞カコワルイ
550 :
NAME IS NULL :2008/03/30(日) 12:02:35 ID:AFfJrt8W
確かに聞かれてもいないのに変な講釈たれるヤツだな 会議でこんなヤツいたら、殴るかシカトかどっちかする
>>550 こういうヤツが上司だったときの対処法を是非教えてくれ。困ってるんだ。
ID厨必死だな
>>530 「え?カラム名がよく聞き取れなかった。もう一回ハッキリと」とかやるわけだな
「 . . . . . 」 「ジェンダー. . .」
全カラムNOT NULLとかしてる?
特に理由がなければデフォルトはNotNullですねぇ。 ついでにデフォルト値も設定するのを標準としたい今日この頃。 SQL書いたときにNull値であることが原因で値が漏れたりするのは勘弁なんで。 そう言う意味では某メジャーDBの''とNULLが同値なのはマジ辞めて欲しい。
必須の項目に空文字が入ってしまう方もどうかと思うが
備考に空文字が入ってる。
住所2にも
なんで入れなくていい項目をNOT NULLにするのか
NULLの扱いが面倒だから
RDBMS側がの扱いも統一されてないからNOT NULLでOK
統一されてないからこそNOT NULLじゃマズいんじゃないの。 ORACLEで WHERE カラム名 = ''とか書いても絶対に0件だし NOT NULLに''をINSERTしたらコケるし。
Oracleぐらいだよな
それはOracleだけじゃないのか? 正直それは違うと思うんだが。
外部キーにもNULL
「統一されてないから」というから統一されてない話をしたわけで 「ORACLEだけ」とか言うのは正直違うと思うんだが
Oracleの文字列はNULL許可で他DBはNOT NULL 空文字とNULLを区別したいケースはほぼ無い
>「統一されてないから」というから統一されてない話をしたわけで >「ORACLEだけ」とか言うのは正直違うと思うんだが 確かOracleだけ扱いが違ったはず。 DB2,MySQL,PostgreSQL,SQLServerは同一だったかと。
だ か ら 「わざわざ」そいういう例を挙げたのに そういう突っ込みは頭悪すぎだろ、と
そもそもNULLを入れなければならない状況は正規化しなければならない時ではないか? 結合したときに出現するならともかく、普通はNULLを入れたいという状況がおかしい!!
なんじゃそりゃ。 住所2テーブルや備考テーブルを作れってことか?
Oracle信者もモノの考え方がおかしい人が多いな。
574 :
NAME IS NULL :2008/04/01(火) 08:43:47 ID:2sq4kbEf
日付にNULLの代わりの値入れてるケースってインデックスによくないよな
>>572 T字型だと理論的にはそういう事になってたと思うよ>住所2テーブルとか
インスタンスが生成された時点で値の入らない属性は存在しちゃだめっていう。
受注テーブルの属性に請求番号があって、受注時にはNULLで
請求時に値が入る、みたいなのだと正規化必要だけど
住所2とかオプション属性みたいなのはなあ・・・。
T字形がそこまでNULLを排除する理由ってよくわかんないや
OOPもその流れな感じだが
>>572 てめえその二項目はNULLを入れる必要ないだろうが。
そこはデフォで空文字列だ。だからテーブルをわけなくてよろしい。
じゃあNULLを入れる必要があるケースを教えてくれ
>>580 そうなったら正規化して排除しろってことでしょ?
NULLを入れなければ正規化しなくてもいいよ。
>>581 排除すべきNULLが入るケースとは?ってことでしょ?
>>575 どうよくないの?そんなのはデータベースの実装側の都合じゃないの?
一時期0001-01-01とか1900-01-01とか入れてたけどやっぱNULLにすべきだと思った。
ッアー!
そんあありえない日付入れるくらいなら数字項目にするかNULLにしとけ、って思う。
オマエは今全国の108歳を敵に回した
>>588 それはもちろんそうなんだけど、インデックスをはったり日付範囲の検索だったりと、実装上は何か値を入れておく方がいいと思う。
>>590 そうなんだよねぇ。バッドノウハウではあるんだけど
パフォーマンス向上のためには仕方ない。
RDBMSによるんだろうけど日付型・NULL可・INDEXで パフォーマンス上問題でるの?
NULL率とNULLを抽出したいかどうか
ぬるぽ
NOT NULLだと若干パフォーマンス落ちるんじゃない?
>>592 例えば前回締め日みたいな日付カラムがあって、
取引開始したばっかりだともちろんNULLになるはずだけど
これを1900/01/01とかにしておくとIS NULLを書かなくて済むので
全件フェッチが防げる。
そもそも前回締め日なんて導出出来るだろうと
おっしゃる方もいると思いますが、パフォーマンス対策で
持ちたい場合もあるのですよ・・・。
あ、そんなややこしいのでなくても 有効期間のFROMとTOなんかがわかりやすいか。 TOが未定の場合なんかもNULLじゃなくて すんごい未来日付を入れておくと to_data >= now() or to_data is null なんてしなくても済むわけです。 こういうのが当たり前みたいになっちゃてるんですが なんか他にかっこいい方法ありますかねぇ。まじで知りたい。
そんな設計していると 9999年問題が起こり、後で自分達が苦労するぞ
タイムマシンが出来たら色んな設計が崩壊する
Toが未定だって状態を別の項目で持てば?
タイムマシンが出来たら20世紀の世界に行って 2000年問題のバグを直しておきたい
>>600 そうやって、どんどんぐちゃぐちゃに...
しかしNULLを許可してしまうとクエリの方がぐちゃぐちゃに・・・。
1) データ構造がぐちゃぐちゃ 2) プログラムがぐちゃぐちゃ 俺なら、2) の方を選択する。
グチャグチャではないだろ。Nullableな型というのはNULLを判別するビットが どこかに埋め込まれてるわけで、それがデータとして表に見えてるか見えてないか。 それだけではないだろうか。
>>605 テーブルのつくりがぐちゃぐちゃになるか
SQL文がぐちゃぐちゃになるかという話であって
どっちの手法も確立してると思うが 理由無しにNOT NULLほとんど入れない奴はなんとかしてほしい
>>606 いやだからテーブルの作りはぐちゃぐちゃではないだろと言ってるわけで
>>608 キミが言ってるのはテーブルの中のデータの有りようなわけで
610 :
597 :2008/04/04(金) 07:06:28 ID:???
>>600 その手もあるんですけど
目的はパフォーマンス対策なんで
なるたけ絞込み条件をORでつなげたくないってのと、
有効期間と他のテーブルの日付カラムをJOINしなきゃいけない場合に
軽くめまいがw
でも、レスありがとうございます。
NULLと日付不明は別にあらわせるようにして欲しかった
日付を格納する項目で「Toが未定」って状態を表す設計は微妙な気がする 解決策の一つではあると思うけど日付型に「状態」の意味を持たせるのはイマイチ ちなみにレスポンスはほとんど(数_秒は変わるかも)改善されないと思う・・・ SQLは多少読みやすくはなると思うけど「9999年は未定」って前提を知らない人が見たらwwwwって思うだろうしな
論理設計と物理設計の話が混ざると話が進まないね。
>>612 >ちなみにレスポンスはほとんど(数_秒は変わるかも)改善されないと思う・・・
IS NULLはフルスキャンになるから、影響はあるんじゃないかな。
つまるところは「計測しろ」となるけど。
日付型のis nullがフルスキャンになるってどのDBMS? 普通のDBMSならそんなことありえんと思うが・・・
論理設計と物理設計を分けて考える理由って何? 分けて考える意味が見出せない
>>614 MS SQLの他はほぼすべてそのはずだよ。一般にNULLは索引に含まれない。
例えばNULL許可のユニーク索引を作ったときNULLのレコードが複数追加できるが、
MSSQLは1件しか追加できない。
>>614 そうなの?知らなかったよ。どういう理屈かよく分からんけど。
>>615 物理設計ではパフォーマンスのために、NULLの代わりとなる値を入れるとか、導出項目も予め計算しておくとか、そういうことを考慮する。
論理設計ではしてはいけない。
>>614 いい加減なことをいうなよ。しかも何故か強気で。
>例えばNULL許可のユニーク索引を作ったときNULLのレコードが複数追加できるが、 >MSSQLは1件しか追加できない。 それはSQLServerのおかしい仕様だと思うが。 漏れはUNIQUE制約のついたカラムにNULLを許可するのはダメ派だ。 つか意味ない。 null可能のカラムにindexを張ってあるならその項目に関してフルスキャンするかは RDBMSによって動作が違うとオモ。 SQLのオプティマイザのエンジンが索引と統計情報とレコード情報を参照して NULL情報を検索するエンジンがいくつかあったはず。 DB2とかはNULL情報をブロック単位&専用ビットで保持しているので、 それらを利用して「最速ケースはどれか?」と判断し動いている。 >論理設計と物理設計の話が混ざると話が進まないね。 これらを混ぜて考えられないヤツは設計&実装しないほうがいい。
>>619 は「有効期間のTOが未定」ということがある場合、どういう設計にするの?
>>620 ?
有効期間のTOはユニークにしないし(FROMだけで一意のはず)
>>619 の話と関係ないんでは
>>619 >>論理設計と物理設計の話が混ざると話が進まないね。
>これらを混ぜて考えられないヤツは設計&実装しないほうがいい。
おかしなことをいうな
あと「漏れ」とか恥ずかしいから止めろ
数値なら-1。文字なら空文字。日付型だけNULLの変わりになりそうな値が無い。
is null は全件スキャンが基本。 そうじゃないのは3値論理をゆがめて実装まっしぐらで 他の所でなにかほころびが出るかも。 この話題は結構実践的かつすんごい有意義なので なるたけ煽りはなしで続けて欲しい。 色んな現場でも色んなプラクティスが聞きたいです。
日付型を使わずに文字列形で日付格納してるのが多かった気がする
Oracleは文字列が多い DB2は数値型が多い MSSQLは日時型が多い 多分
NOT NULL指定の無いカラムを真っ先に検索しはしないだろう ふつう
>>>論理設計と物理設計の話が混ざると話が進まないね。 >>これらを混ぜて考えられないヤツは設計&実装しないほうがいい。 >おかしなことをいうな おかしいと主張するヤツの脳はほとんどの場合おかしい。 こういうやつの設計&実装は100%くらいの確立で糞だったりする。
落ち着け。 1行目と2行目が矛盾してるという話だろ
____ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /_ノ ヽ、_\ ( もう・・・私のばか・・・・!!! . / (● ) (● )\ ( また本心と・・・・違うこと・・言っちゃったお・・・ ///////(__人__)///\ ◯ ほんとは・・・素直になりたいのに//// | | 。O  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄ \ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
>is null は全件スキャンが基本。 〜 >この話題は結構実践的かつすんごい有意義なので >なるたけ煽りはなしで続けて欲しい。 コイツって前のID厨か? 相変わらず具体例ださずに決め付けてるんだが。 持論以外は認めないのにクレクレしてる辺りがそんな匂いする。
またか? ID丸出しでやったら面白いことになるかもな。
今度はID厨からフルスキャン厨でつか 知識が乏しくマニュアルがないとなんにも出来ないタイプの人間なんだろ。 >MS ;SQLの他はほぼすべてそのはずだよ。一般にNULLは索引に含まれない。 >例えばNULL許可のユニーク索引を作ったときNULLのレコードが複数追加できるが、 この辺りはRDBMSによって違うんだからMSSQL(ナニコレ?前後の文からSQLServerか?)しか 知らん厨が世界の中心みたいに設計を語るのは滑稽だな。 SQLServerが99%くらいシェア獲ってるならともかくなー。
MSQL知らないってどんだけー
>>633 は人にどうこう意見する前に自分の恥ずかしさを理解すべきだな
MSQLってマジでどんな製品なんだ? 商用OracleやオープンなMySQLよりもシェア獲ってる製品なのか?
MySQLよりも昔、黎明期のPostgresと同時期に存在した オープンソースのRDBMSだよ。
とりあえず、この板のスレ名に使われないくらい有名なRDBMSだな。w
MSSQL表記知らないとか
自分も知らなかったけど 「知らないのにえらそうに語ってしまってすみません」でいいじゃん。 なに必死になってんだか
mSQL
自分も見たことも聞いたこともないRDBMSだけど、 そんなドマイナーな製品に対して「知らんのか?」と言う方がアタマおかしいと思う。 なに必死に自作自演しているんだか。
>>643 普通にしてて知らなかったってだけなら
ここまで叩かれないでしょ。
煽った方がばかっぽくなっちゃうのな、ここは。
スレの流れ的に技術的な話をしている最中に 煽りフルスキャン厨が話の腰を折っている(MSSQL知らんのか?)に見えるんだが。 技術的な間違いのツッコミにはスルーしているしな。
確かに間違いを指摘されてから、叩きカキコしかしてねーな。 MSQL厨は。w
ばれてるよ
ばればれw ミッションクリティカル厨だろw
よほど悔しかったと見える。
三値理論がいい加減な実装の具体的な例。 postgreSQLの7.x以前のcaseの動作で case NULL then ....と書くと、true/falseで返ってくる。 8.x以降だとちゃんとunknownになる。 ありゃはまった。まあ、最初にはまるようなSQL書いた俺が悪いのだが。
おっと間違えた、三値論理。
と言ってもこのスレ的にはMSQLが全てらしいからなぁ。w
ちがうよ。このスレは、ミッションクリティカルで メインフレーム・ホスト・オフコン屋がすべてなんだよ。 句読点の後にwつけるのあんただけだよ。気をつけな。
654 :
650 :2008/04/07(月) 10:46:00 ID:???
自分で書いておいてこれはひどい。寝起きに書くのはやめよう。 case hoge when null then "nullです" else "nullじゃない" end とか書くと、nullだろうとそうでなかろうと"nullじゃない"と 表示されるべきなんだけど、ポスグレ7.xだと nullだと"nullです"って表示される。 というような事を書きたかった。 8.xに移行したら表示がおかしくなってまいった。 こんなの書く俺が悪いけど、動いてくれるんだもんなー。
DB設計関連で、コレは読んどけ!という本があれば教えて下さい
データベース実践講義
業務寄りなら渡辺幸三さんの本なんかがよいと思う。こちらは自然キー派。 ID厨ってなに?って人は『楽々ERDレッスン』。 偉そうな文章読んで気分高揚させたい場合は佐藤正美さんのT字形の本。 RDBMSの実装の話で入門編だと『RDBMS解剖学』って本がとてもわかりやすかったです。 設計とは違うけど、設計する時やSQLを書くときに気を使うようになりました。
>>654 > nullだろうとそうでなかろうと"nullじゃない"と表示されるべきなんだけど、
無知晒して楽しいか?
ちゃんとマニュアル読めよ。
| 9.2 比較演算子
| (...中略...)
| NULL と NULL とは "等しい" 関係にはありませんので、expression = NULL
| と記述してはいけません (NULL 値は不明の値を表しているため、不明な値
| 同士が同じかどうかは識別できません)。これは標準 SQL に従った動作です。
>>654 が混乱しているのは確かだけども
> nullだろうとそうでなかろうと"nullじゃない"と表示されるべき
というのは合ってるんじゃないか?
> 不明な値同士が同じかどうかは識別できません 同じかどうかわからないだけで、必ず違うと言ってるわけじゃないよ。
>>660 同じかどうか分からないから、foo = NULLはunknownであって絶対にtrueにはならない。
3値論理の話な。
それがpostgresの7系だと間違った実装で、fooがnullの場合にtrueになってたと。
そのダメ実装に依存した「when null」という勘違いSQLを654は書いてたのだけど
8.xに移行したら挙動が変わっててハマったといいたかったのだろう。
662 :
654 :2008/04/09(水) 14:13:18 ID:???
>>661 そうそう、その通りです。
だから無知をさらしてるってのは、まあ合ってるんだけど。
三値論理の間違った実装の具体例をあげろみたいなレスが
あったから参考までにって書いただけなのに・・・・。
なんでここは
>>658 みたいなのがわくんだか。
例のホスト屋さん?
663 :
654 :2008/04/09(水) 14:19:47 ID:???
ああ、俺が "nullじゃない" なんて文字列を
例に使ったのが紛らわしかったのか。
else "nullじゃない" end だから、unknownだったら
こっちが表示されるべき、ってことです。
お騒がせでした、煽ってごめん
>>658
664 :
>>660 :2008/04/09(水) 21:37:50 ID:???
DBの設計とはちょっと違うけど、セキュリティはどうしてますか。 もしユーザーが悪意を持ってDBにアクセスしてきたらと思ったら つまってしまいます・・・。内部の人間がデータぶっこぬきとか
>>665 内部の人間とは、アカウントのユーザー名とパスワードを知っている人間ということ?
だとしたら、打つ手はない。
新聞やテレビでしばしばみるのは、開発者による違法アクセス。
これなんかお手上げだよね。
DBA権限持った人間がデータ抜けないようにするって話なら リムーバルメディア使えなくしたり 施錠や警備員等物理的セキュリティをしっかりさせたり… 本当に関係ない話になっちゃうな
668 :
654 :2008/04/10(木) 00:03:54 ID:???
>>664 いやいや俺もここ最近の荒れ具合から
脊髄反射みたく煽っちゃってごめんなさい。
でも俺が無知なSQLを書いちゃったのは本当だからさw
みなさん反面教師にしていただければこれ幸い。
>>665 セキュリティは、ロジックを伴う所はアプリ任せにしてます。
この権限の場合はこのデータが見れる、とか。
如実にお客様からの要件が反映される所だから。
で、アプリからはひとつのDBのユーザーで接続するようになってて
他のユーザーは最初から作らない。
制約をどこまでDB側に持たすかって話と近いかも。
内部の人間がぶっこぬきとかの話はもう
ソーシャルエンジニアリングの世界だからアプリだろうと
DBだろうと、やる奴はやるからねぇ・・・・・。
データベース管理者が違法アクセス防止のために、ユーザー名とパスワードを頻繁に変更できる ようにしとけば安心かな? でも、そこまでやっているDBシステムか見たことがない。多くがプログラム埋め込み。
正直、内部の人間が不正アクセスでデータが抜かれるのはある意味仕方ないと言うとアレだが DBにしてみれば不正も正当も区別がつかないので、ジャーナルとかで アクセス記録とっておけばいいんじゃね?って感じだな。
監査証跡(audit trail) というやつか
今やってるのが漏れると損害賠償でうん億円の世界なのでびびってます・・・
主キー 顧客コード 表示順 名称 120 50 10 XXXX 105 50 20 xxxxxx 110 50 30 XXXX 106 90 10 XXXX 104 90 20 YYYYYYY 111 90 30 @@@@@@@ 今使っているシステムでこんなテープルがあります。 同一顧客コード内でレコードの表示順番を制御するために「表示順」列を設けています 。 「表示順」列は重複許可でNULL不許可。 同一の顧客コードのレコード数は1〜50件程度で不定。 今は、表示順番を変えるために、このテーブルの修正入力画面で表示順の数値を手入力 しています。 リストビューやツリービューみたいな画面でレコードをドラッグ&ドロップ等で簡単に できたらと 考えてるんですけど、このテーブルに対して、 ● クライアント画面で、レコードをドロップしたら表示順番を更新するストアドを呼 び出す。 という処理でいいんですかね。 それとも「表示順」列で制御、っていう考え自体おかしくて、見直した方がいいですか。 近くこのシステム全体を作り直すんで、テーブル設計自体が変だったらそこから直しち ゃおうか と思ってるんですが。
何のテーブルか分からん
675 :
NAME IS NULL :2008/04/10(木) 21:18:00 ID:BYawDpKG
名寄せだろ
表示順カラムは別におかしくないよ。 順番の更新処理はストアドでもホスト言語ででもどっちでもいいんじゃね?
>>673 データをデータベースに反映させるタイミングは考えたほうがいいだろうね。
ドロップ時点で即座に反映する必要性はどの程度あるのかとか。
表示順の変更以外はありえない、というケースは少なくて 大概は画面で顧客名変更やレコードの追加・削除もありうるから 決定ボタン押したタイミングで顧客コードでDEL/INSが普通かなぁ。
ちょっと基本的な質問ですまん。 高速道路のETCゲート通過とETCカードとWEB上でのETC利用歴検索 のリンクがどうなってるのかちょっと知りたい(興味半分だけど) 皆さん忙しいと思うけどよろしく頼みます。 いや、この前ねある病院で電子カルテシステムがダウンしたのよ。 その当日に出くわしてね、本日のすべての処理は紙の伝票システムで 運営するとの事、医者は紙のカルテに書くのは久しぶりだとかで手間取り 診療科目をまたぐと大変時間がかかるし、医療事務の精算はできないし 投薬の履歴は出てこないしとさんざんだった。 そこで思ったのがETCシステムのことでしたね、あの膨大なデータの 処理をどうしてるか気になりだして仕方なくなりました。
確か日本野鳥の会がやってたはず
>>679 WEB上でのETC利用歴検索はリアルタイムというわけではないでしょう。
病院のシステムって二重化してないんかw
カルテシステムとかだと、ダウンタイム "0" を要求されるわけじゃないから、 ハード障害には当日オンコール保守で対応と言うのがが多いんじゃないかな。 あと二重化してあってもソフトのバグとかで両系ダウンすることもあるし。
電カルは医療機器の組み込みとは違うもんね。 うちのヨメの勤め先でも電カルがダウンした時は 忙しかったけどまあ手でなんとかしのいだって。
オーダリングのみのダウンならば、導入以前の紙の伝票を回しての運用に戻せばいいんだろうけど、 電子カルテがダウンしたらどうなるんだろうか。カルテが参照できないってこと?診療自体がストップしない?
時系列の変化は見えなくなるけど、目の前に患者はいるんだし現在の検査数値は 見えるんだから最低限の診療はできると思うよ。 まあ、ほんとのところは医者に聞かないとわからないが...。
>>685 ヨメに聞いてみた。
電カル導入以前からあった基幹システムみたいなのがあって、
それが機能拡張で電カルの保存サーバみたく機能してたので、
参照は出来たんだって。その日の分は紙で回して
診療がストップする事はなかったけど
何が大変って受付業務がてんやわんやだったらしいです。
自動受付機と自動会計機が停止してしまうからでしょう。 受付と会計のすべてが手動作業になる。これが一番大変。 受付担当者も大変だが、患者さんも長時間待たされることになる。 あとは処方かな。システムが稼動していれば、処方は前回のコピペでほぼ済むんだが、 システムが停止してしまうと、医者は手書きで処方箋を書かなくてはならなくなる。 システムが停止するのは、開発運用者にとっては最大の汚点のひとつなのだが、 システムの有用性・価値を認識してもらう機会でもあるわけだ。 もちろん、ないに越したことはない。
689 :
NAME IS NULL :2008/04/29(火) 22:35:25 ID:476VLZj4
マスタとトランザクションデータのカラム設計について。 マスタは、データを履歴管理(=マスタデータの有効期間)で持っているとします。 トランザクション発生時において、 マスタのデータをトランザクションデータ内にコピーするかどうか、 どのような方針が適切なのでしょうか。 具体的には、下記テーブル設計の場合に、 ○Tマスタ(master_id, master_data, 有効期間) ○Tトランザクションデータ(tx_id, master_id, tx発生日) Tトランザクションデータにカラムmaster_dataを設けるかどうか、ということです。 カラムを設けない(=TマスタをTトランザクションデータから常に参照する)というのが綺麗なのは分かります。 ただ、実運用上で問題が出ないかどうかが心配です。 たとえば、ある一部のトランザクションだけマスタデータの値の修正をする必要が出るとか。
>>689 1.マスターの有効期間が変化する。常に最新の期間条件で読み出す必要がある。
2.マスターの有効期間は変化しない。
3.マスターの有効期間は変化するが、登録時の情報を参照すればよい。
1の場合は仕方ないとして、2,3の場合は有効期間をキーにしないで、
有効期間が異なれば別のIDをふる、または、ID+履歴番号をキーとする。
やり方はケースバイケースであるが、主キーに有効期間そのものを含んでたら
間違った設計と思ったほうが良い。
日付の項目と複合でPKにするのは煩雑杉て保守で死ぬ予感 綺麗かもしれないけど、管理する必要があるかどうかで判断してみては?
元気かなあ、あの句読点の後にwの人。
694 :
NAME IS NULL :2008/04/30(水) 13:51:07 ID:1zoOlTvF
aiueo
695 :
NAME IS NULL :2008/04/30(水) 13:51:36 ID:1zoOlTvF
www.oracle.co.jp otn.oracle.co.jpがみれないんだけど。。
両方ともトップページは普通に開けるけど。
697 :
sage :2008/04/30(水) 15:15:50 ID:1zoOlTvF
みれました。すいません。なぜかFireFoxでは見れませんでした。 IEで見れました。お手数おかけしました。 でもなんでだろう。なにか設定しちゃったのかな。。。 どうもです。
698 :
NAME IS NULL :2008/04/30(水) 20:38:22 ID:kArgI2Pd
Windowsのエクスプローラのような再帰的な階層リストを、DB化しようと思ったのですが、 考えてみると意外と難しい。。 階層フィールドを作って、ゴリゴリ頑張るような設計しか思いつかないのですが、 スマートな設計がありましたら、ぜひ伝授して下さい。 よろしくお願いします。
普通に create table 階層リスト ( id int not nul primary key auto_increment, 上位 int, -- 上位ノードの id を指す 情報1 ..., 情報2 ..., ... ); でいいんじゃないかな。 使うには、再帰 SQL を覚えておいた方がいいけど。
正直iノードを自前で実装するのと大差なくなってくると思うが。
まあ、定番だからな。
生産管理のデータベース設計の本とか参照するとか。 BOMは大変だよなー。
703 :
698 :2008/05/01(木) 14:14:39 ID:???
>>699-702 thx!
上位ID + 階層で やってみます。
再帰SQLは、SQLServer2005から対応との記述をみました。
2000では無理そうですが、プログラムの方でなんとかしてみようかと思います。
こういうのは普通はCで実装するからなぁ。
全てのテーブルに必ず対応するビューを定義するって設計は実際ありますか?
コッドが泣いてる
>>705 設計ではないが要望されてやった事はあるな。
英数字のカラム名しか認めないRDBMSに接続するAccessがあって、
「英語のカラム名はよく解らん」と言う理由でAccess上に日本語カラムを入れた
ビューを作った事はあるけど・・・。
でも意味のないビューは作らないとオモ。
昔はよくやったな。 参照は全てビュー経由にすることで、 項目変更などの影響を受けにくくする、 みたいな目的で。 今はビュー作るの自体が流行らん感じ
>>709 >今はビュー作るの自体が流行らん感じ
そうなん?マテビューとか便利だしちゃんと設計されたDBにアクセスするなら必須だと思うけど?
ちゃんと設計されたDBでビュー使うメリットって基本的にないからね。 アプリケーションフレームワークが関連までサポートしてくれる現状、 DB側でおせっかいされてもうっとうしいだけだし。 マテビューは使うけど、ありゃ厳密にはビューじゃないしな
そんなアホポリシーをわざわざ披露してくれなくてもいいよ。
>>711 すまんな、「ちゃんと設計されたDB」の認識が全然違ったみたいだ
今のビューの使い方だと「ちゃんと設計されてないDB」を「ちゃんと設計されたDB」に仲間入り させる時に使うくらいだなぁ。 横長DBを普通のDBにするとか。
マテビュはパフォーマンス目的だしな 変更に強くなる・・・っていう目的で使ってる奴いないの? 情報処理の試験でそう覚えたからなんかがっかりだよ
まあ、ちゃんと設計されてれば
>>714 みたいな本来不要なビューは
なくなるんだろうけど、ちゃんと設計されてても有益なビューはあ
ると思うぞ。
正規化したらアプリインターフェースとしてテーブルは余り適さないと思うんだけど・・・ 専用DBは除いて。
>変更に強くなる・・・っていう目的で使ってる奴いないの? >情報処理の試験でそう覚えたからなんかがっかりだよ 逆に聞きたいんだが「変更に強いビュー」と言う例をあげてくれないか? 正直、強いも弱いもないと思うが。
>正規化したらアプリインターフェースとしてテーブルは余り適さないと思うんだけど・・・ こういうExcelやCOBOL志向の人が横長DBを作って他のエンジニアから ウザかられるんだろうなぁ。
なんだGWか・・・
>>718 > 逆に聞きたいんだが「変更に強いビュー」と言う例をあげてくれないか?
「変更に強いビュー」じゃなくて、(テーブルの変更を) ビューで吸収する
ことで、テーブルの変更に強い (=アプリ側の変更をしなくて済む) ように
するってことだろ。
単にアプリ側の修正で済むかRDBMSの修正で済むかの違いなんだろうけど、 現実的にテーブルの変更をビューで吸収する設計ってあんま見たことないが。 アクセス権とかユーザーに見せたくないカラムがあったりするとかそういう意味で ビューを用意する事はあるけど、「変更ありき」でテーブル&ビュー設計って やってる人は見たことないなぁ。
お前の周りはそう言う開発ポリシーなんだろ。 別に何の問題もない。 でかいシステムで ・DB 周りの設計者とアプリの開発が別組織 なんかのケースだと、アプリの変更はおおごとになるからビューで 何とかするのは割と良くある話。
お前の周りはそう言う開発ポリシーなんだろ。 別に何の問題もない。 でかいシステムで ・DB 周りの設計者とアプリの開発が別組織 なんかのケースだと、DBの変更はおおごとになるからアプリで 何とかするのは割と良くある話。 ----- つか別組織って別会社でもあるまいし。 小さい組織の自称「でかいシステム」はビューでなんとかするかもしれんな。
> つか別組織って別会社でもあるまいし。 別会社のケースもあるよ。 そう言うシステム知らんだけだろ。
アプリ変更するとテストがたくさん発生するからやっかい それに作った奴らなんて数年したらいなくなるし 仕様書なんてまともに残ってねぇ 最適解は次回リプレース時のどさくさにまぎれて変更だ
ビューの方が好き勝手に作っても迷惑かける分が少ない
>>724 ある程度の規模なら別会社が普通だよ。
「出来ませんでした」の影響を最小限にとどめる。
血税使う所は例外だった気もするが・・・
>>723 そのくらいの規模でやっていれば、たとえ論理的にイコールでアプリに直接影響が
出ない変更であっても、確認・検証は必要だしそれなりにおおごとになるのでは?
一方で、ビューで吸収できる変更というのは、ビューを使っていなかったとしても
DB側だけで解決できるものだから、アプリ開発が別組織だったとしてもビューを
使う理由になるとは思えん。
本当にそんなによくある話なのか?
結局、どちらが修正コスト低いか?なんて現場によりけりなのに、 「ビューの方が変更に強い」なんて迷信を信じてるのがオカシイってだけだと思うが。 なんかマニュアル命で現場によって技術を使い分ける事を知らん厨が 声だかに喚いているだけに思えるが。
>>729 > DB側だけで解決できるものだから
テーブル変更しろって?
もう少し実務に携わってから書き込んだほうがいいと思うよ。
テーブル変更のリスクは経験しないと分からんことも多いから。
(普通の頭もってりゃちょっと考えれば分かるとも思うけどな。)
>>730 「現場によりけり」「技術を使い分ける」と書きながら、
「ビューの方が変更に強い」を迷信と断言するあたりが
バカっぽいんですが、今時釣りでしょうか? (w
ナニこのヒト? 学生?
>>731 いずれにせよ実表の変更なんてものはたいへんなことだ。特に大規模案件であれば。
ビューで解決すればリスクが小さいなんてことはないし、ましてや最初からそれを
織り込んだ設計をするなんて非常に考えにくいんだが。
そもそもここで想定している変更とはなんだ?
フィールドの追加か?それとも実表の分割か?
何回書いてもわからん奴っているんだな...。 「現場によりけり」「技術を使い分ける」んだろ? ・ビューで解決のリスク < アプリで解決のリスク のケースがあるということぐらい想像できないのか? もし常に ・ビューで解決のリスク > アプリで解決のリスク だと言うなら、それを証明してくれ。
物理表にはアクセスしないようにするのが真のRDBの定義だっけ
>>734 まぁGWだしさ、放置マジオヌヌメ
設計概念からビューの位置付けまで全然違うんだから
ビューって管理がめんどい。 ER図に表現できないから、たくさん作ったらわけわからんくなる。 なんかいい方法ある?
>>734 アプリ修正の話じゃないよ。
>>723 の言うような、アプリ変更を避けるために予めビューを介してアクセスするような
設計が本当に大規模事案で本当に「よくある」話なのかどうか、そして、それは
テーブル直接アクセスに比べてどのような変更のケースで優位なのかという話だ。
1つのテーブルに2つ以上のサブシステムがアクセスしている場合、 ビューを用いたほうが改修とテストが少ない場合がある サブシステムAを改修したいのに、サブシステムBまで改修する必要がでてくるのは面倒 別ビューで参照しとけばテストも不要だしね
740 :
>>723 :2008/05/06(火) 11:16:17 ID:???
>>738 > アプリ修正の話じゃないよ。
> アプリ変更を避けるために
言ってることがさっぱりわからん。
修正と変更が違うと言いたいのか?
> 本当に「よくある」話なのかどうか
ああ悪かった、「俺の職場では」良くある話だ。
これで満足か?
# 理解 {できない|しようとしない} 奴にも何を言っても無駄。
>>737 >ER図に表現できない
「表現」の捉え方が違うンだと思うが、出来ない事無くないか?
大概のER図作成ツールにはビューはあるし。
俺は一応ER図に載せて、定義書も書いて(出力して)ある。
で、どんどんビューが増えて、結果的に負の遺産となる。ってパターンだろうなぁ。
はいはい、君の言うことは全て正しいから、満足したらさっさと巣に帰れ。
なんでこんなに必死なんだろう?
どうせそのうちまた被害妄想と自演認定始めるんだろ。 またの登場を待ってましたよ。
きっと自分のいう事は全て正しいと思い込んでいるんだろな。 だから、ちょっとした反論があると「奴にも何を言っても無駄。」と 思考停止に陥るおこちゃまってトコだろ。
つかツッコミうけると排他主義者はすぐファビョるよな。
つかみんな小規模か作り投げしかして無いの? 739なんて至極まっとうな事書いてると思うけどスルーだし・・・ 正直、738は日本語ムツカシイ人でしょ。読んでくと小規模って言われてファビョっちゃった感アリアリ。
俺も
>>739 は正しいと思う。
ただ正しいことが理解できない奴が暴れてるだけでしょ。
GW も終わりなので、スルーしときましょ。
>>740 いや、
>>729 >>739 ではアプリ修正を「しない」前提でビューで解決する場合と
テーブルを直接変更する場合の比較だから。
>>739 のようにサブシステムごとに異なるビューを介してアクセスする設計も
ありはするが、一般的には
>>722 の言うような目的だろう。
将来の変更へのバッファとしてみた場合、それが有効である条件とういうのは
限られていると思っているんで、どのような変更を想定していたのか聞いてみた
だけだが。
レス内容から分かるレベルで経験無いのに一般的とか使うかね・・・
日本語でおk
>739のケースでひとつのテーブルに複数のシステムがあったらとか言っているけど
table1 {col1 int,col2 int,col3 char(10)}とかあったとして
このテーブルに二つのサブシステムだろうが、二つのプログラムだろうが、
select col1 from table1やらselect col2 from table1やら別々クエリ投げていたとして
こういうのでビューを使う必然ってドコにあんの?
仮にここでcol3 char(10)がcol3 char(12)になったらcol3を使うクエリ部分のアプリ修正が
入るのは必ずあると思うけど。
もしかしてビューで left(col3,10) as col3とか定義してアプリ側は修正なし!とか
言うのは違うだろ、と思うけ。郵便番号とか会員IDとかサ。leftならともかく
rightやmidな変更をビューで吸収しようなんて漏れは考えないけど。
たとえアプリの修正がなくてもテストはするだろうし。
そんな変更要件ならアプリ側で「leftで読んで、そこをユニットテスト汁」と言うけど。
>>722 が言っているのはこういう変更を見越して(w)、全てのテーブルにビュー定義
している人は多くないだろ、って事だとオモ。
>>753 ビューを作成する主な目的は
複数のテーブルがあって、それがあるキーによってリンクしているようなケースだろ
つまり、JOINしたものをアプリケーション側にひとつのテーブルとしてみせる
ということ
>>754 そういう目的であらかじめビューを作っておくというのは、後から
create view table_a as
select hoge, hoge
from real_table_a
join real_table_b
のように変更できるよう、最初から
create view table_a as select * from real_table_a
として作っておくということなのかな?激しく無意味な気がするが。
そうじゃないとするとどういう意味なんだろう?
RSSリーダーの設計を下記のようにしました。 User *---1 Subscription 1---* Feed 1---* Item Rails的にはこうです。 User has_many :subscriptions has_many :feeds, :through=>:subscriptions Subscription belongs_to :user belongs_to :feed Feed has_many :subscriptions has_many :users, :through=>:subscriptions has_many :entries Entry belongs_to :feed このとき、あるユーザの購読しているFeedのEntry全部を日時順にまとめ読みしたい場合 order by entries.created_atとしますが、mysqlのexplainでどうしてもfilesortがでてしまうとおもいます。 こういった関係になるケースは割とあると思うのですが、どう対処したらよいのでしょうか。 filesortは気にしない、UNION、サブクエリ、アプリ側でソート、etc...
>>754 >ビューを作成する主な目的は
>複数のテーブルがあって、それがあるキーによってリンクしているようなケースだろ
だろ、って断定されても困るが。
その理屈だと「全てのアプリはそのアプリに割り当てられたビュー経由でしかアクセスは
許しません」って設計思想なんだろう。
正直、手間と管理コストばかりかかって廃れていくと思う。
実際俺の周りでは廃れてきた。 経験的に、面倒くさいだけってことがわかってきたようだ
今の時勢でDB触る開発内にこんな奴いるんだな・・・
なんかこのスレって、胡散臭い教科書に載ってた過去の都市伝説を信じて 「俺の大規模システムの職場では・・・」とか偉そうに語るやつがいるけど 実際に現場の実装レベルの話で具体的に反論されると 「今の時勢でDB触る開発内にこんな奴いるんだな・・・」なんて 子供な捨て台詞を言う素人がウザいな。 悔しいなら具体的に証明すればいいのに。
>>760 大規模経験無い人間が書いた「実際に現場の実装レベル」ってどんなレベルだよw
みんな頑張って相手してあげてるじゃん。こんなアホ臭いレベルに
前から思ってるんだけど、 「大規模やったことないだろ」とか 「ミッションクリティカルなやつでは通用しないよ」って いわれたらさ、 「小規模やったことないだろ」とか 「軽いシステムじゃ通用しないよ」とか 言い返せばいいんじゃないの?
ビューとかストアドとかはDB屋が業務に関わるための死線だから、 どうしても擁護に必死になってしまうのは仕方ない。 でも、最近はアプリ側のフレームワークがなんでもしてくれるようになって DBサイドでどうにかしようってのは本当に減ってきたね。
そもそもDB屋がいなくて困っている……。
>>762 つか、単に現実味のない話をする妄想なビュー信者の厨房はスルーすればいいのでは?
なんだかんだ言って具体的な技術論になると逃げて「アホ臭いレベルに!」とか
涙目になってキーボード叩くだけの無能だし。
>ビューとかストアドとかはDB屋が業務に関わるための死線だから、 >どうしても擁護に必死になってしまうのは仕方ない。 ああ、だから涙目になって反論しているか。
>>765 うーん、ビューの話に限らず、IDの話の時もNULLの話の時も、
なんかすぐに「大規模だと通用しない」とかって話になるじゃん。
まさか同一人物だとは思わないけど、でもそれも真実ではあるんだよ。
確かに通用しないんだろうから。
でもさ、じゃあ大規模のやり方が中小規模のシステムで
通用するかっていうと、そうじゃないじゃん。
なのに、「大規模は〜」って言われると黙っちゃうのが不思議なんだよなー。
ってそんだけ。
>>762 規模の大小ってのは漠然としすぎているかも知れんが、そういう前提条件を
明確にして議論してりゃ別に問題ないはずなんだよな。
例えば他スレでPreparedStatementの議論があったけど、一般的には推奨される
PreparedStatementも、データの分布に偏りがあるデータベースでは必ずしも最適な
実行計画が得られないし、1クエリに何分もかかるような分析アプリケーションでは
パース・実行計画のコストよりも実行計画自体が最適であることの方が重要だから
動的SQLが使われることが多かったりするわけだ。
これは一般的な例ではないかもしれないけれども、「一般的な常識」が必ずしも
すべての場合で有効とは限らない例ということで。
> 「現場によりけり」「技術を使い分ける」 と自分で書きながら、実践できてない奴が暴れてるだけだろ。 ビュー信者もウザイけど、フレームワークがどうのこうのとか言ってる奴も 同レベルだし。
大規模はとりかえしのつかない設計を引きずってるところが多いからあてにならない
全然技術な話じゃなくインターフェース定義なんだけどねぇ・・・ アプリ側で考えみなよ 別会社が設計したER図ポンと渡されてちょっとした説明だけとアプリ要求に即したビューがあるのと。 そのインターフェースさえ崩れなければ 改修時はアプリ側は最悪UPDATE側のテストだけで済むからコスト大幅に減るし、 開発時は最低限SELECTが簡易になってるからコスト減るしねぇ。 それが何故かビュー=制約の前提だからねぇ、ちゃんとビューの説明もしてもらってるのに・・・
>>771 そういうのもあるけど、そういう場合って必須キー指定、JOIN禁止とかにしてない?
要はアプリ開発側に勝手なSQL書かせてパフォーマンス障害を起こさないよう、
DB設計側でアクセス方法を指定するやりかた。
似たようなのでは、ビューを作らずともSQLをまんま渡して、これだけを使え、
ってのもあるよな。
逆に、アプリ開発側でSQLも組むんであれば、ビューの中身がブラックボックス
だとかDB側で勝手に変更するとかは考えにくいけど。
> そういう場合って必須キー指定、JOIN禁止とかにしてない? そうであるところもあるし、そうでないところもある。 > DB側で勝手に変更するとかは考えにくいけど。 自分が変更するにしても、DB 側だけで済む方が楽なケースだってあるだろ。 # 自分の世界が常に正しいと信じてる人なのか...。
>>772 このスレは制限するのが大好きだなw
方向性が全然違うんだが・・・
インターフェース定義はアプリ開発会社ときっちり詰める、どう使われるかなどね。
まぁ、ER図渡す場合にきっちり詰めても、タスクがアプリ会社に移るかこっちで持つかの違いだけ。
諸事情ありこっちで受けた。
>> DB側で勝手に変更するとかは考えにくいけど。 >自分が変更するにしても、DB 側だけで済む方が楽なケースだってあるだろ。 ># 自分の世界が常に正しいと信じてる人なのか...。 自分の世界が常に正しいと信じてる人の典型的なレスだな。 その楽なケースを具体的に説明して欲しいモノだ。 存在しない脳内妄想なんだろうけど。
>>774 ちゃんと情報共有してんならごく普通でない?
問題があるとすれば、どういう使い方しているか把握していないのに
連絡もせずにビュー定義の内容を変更するとかしちゃう場合だろうね。
>>775 > その楽なケースを具体的に説明して欲しいモノだ。
例えば1つのデータベースに複数のアプリがアクセスしているなら、
いちいちアプリを変更するよりデータベース側を変更する方が楽な
場合があると言うことぐらい、ちょっと脳味噌あったりわかりそう
なもんだが...。
>>775 だから調整とかインターフェース定義経験無いでしょw
わかりやすいように772に書いたんだけどねぇ・・・
って単なる鸚鵡返しの煽りかw
>>776 それを制限の方向に独自解釈してウダウダ言ってるからおじさん笑ってた訳。
>問題があるとすれば、どういう使い方しているか把握していないのに
>連絡もせずにビュー定義の内容を変更するとかしちゃう場合だろうね。
一応ER図・定義書には区分け・コメント(修正時の影響範囲)入れてあるから余程のミスアサインが無い限り問題ないと思うよ。
>>778 ここで言っている「制限」というのがアクセス規約のことであれば、そこは別に
方向性が全然違うというわけではないんだがな。
おじさんは
>>774 で、インターフェースをどう使うかちゃんと詰めると書いてるけど、
重要なのはその部分で、単なるインターフェース定義だけを共有するのではなく
どのようにアクセスされるかまで共通認識を持つ必要があるということ。
ここで、おじさんのように全部事細かに確認できればいいんだけど、規模が大きい
場合はさすがに全部は確認しきれないから、「こういうルールでアクセスする分には
問題ないですよ」として、あとはまかせるわけ。
> 規模が大きい場合はさすがに全部は確認しきれないから、 > 「こういうルールでアクセスする分には問題ないですよ」 > として、あとはまかせるわけ。 経験ないこと丸わかりのレス乙。(w
なんかアレだな。
持論以外は「経験ないこと丸わかりのレス乙。(w」とかいって
都合の悪い事はスルーしまくってる当人が言うのもかなり滑稽なんだが。
>>781 のツッコミなんか
>>774 のいう事を全否定だし。
って書くとツマラネェ煽りが返ってくるんだろうなぁ。
>>781 この手のレスはやたらあるけど、じゃあ具体的にはどうしてるのか、というのはほとんどないのな。
俺も経験ないから、そういう情報を知りたくてこのスレウォッチしてるんだけど……。
>>780 >方向性が全然違うというわけではないんだがな。
下読んだらわかったけど、それにしてもマイナス方向並べすぎw
>ここで、おじさんのように全部事細かに確認できればいいんだけど、規模が大きい
>場合はさすがに全部は確認しきれないから、「こういうルールでアクセスする分には
>問題ないですよ」として、あとはまかせるわけ。
同じ経験あるけどさ、Project全体としての進行手法として違う気がする訳よ。
上流でその必要性を顧客説明して言ってる?ちゃんと説明すれば食いつくと思うけどねぇ。
774はそのコストが出たから出来たのは言うとおり。
必要性・プラマイ説明して数字並べても出し渋る顧客なら・・・ルール付けだけになっても仕方ない。
なんら拘束力無いルールだし、俺は人信用しないから逃げ道確保に力を注ぐねw
しかし、自分で言うのはいいが、人にオジサンと言われると少し凹むな・・・
句読点の後ろにwつけてんのは 無視していいよ、鬱陶しい事になるから。
>>
>
>>781 のツッコミなんか
>>774 のいう事を全否定だし。
煽りがどうのこうの言う以前に、どう理解したら全否定に思えるのか不思議でならない。
>>783 > じゃあ具体的にはどうしてるのか
地道にやるしかないよ。
大規模だからと言って妙手があるわけじゃないし、仮にあったとしてもよほど実績がな
いと怖くて使えないから、結局きちんと仕様書書いてよってたかってレビューして、問
題点を管理してと言うのをひたすらやっていくしかない。
結局はそこの設計をどこまできちんとできるかで勝負が決まるのはわかっているけど、
わかっていてもなかなか辛い作業ではある。
しかし、だからと言って、
>>780 みたいに「あとはまかせる」なんてやったら、そこら
じゅうで思い違いが発生して収拾つかなくなる。小規模ならどうにでもなるけど、大規
模でそんなことやったらデスマどころかプロジェクトが崩壊する。
>>780 に少しでも大規模DBの経験があったらあんなことはやらないし、周りがやらせ
ないよ。
787 :
NAME IS NULL :2008/05/21(水) 02:46:49 ID:a5f8YH2n
カラムの命名の話なんですが、うちのシステムではテーブルごとに決めた 接頭辞を全カラムにつけています。 userテーブルならusr_id, usr_name, usr_email。classテーブルならcls_id...みたいに。 これならどんなテーブルを結合してもカラム名が重複しなくて けっこういいアイデアだと思うのですが、よそでやっているのを見たことはありません。 この方式ってどうでしょうか?
>>787 メリットって大した事ないんじゃないでしょうか。
外部キーで結合時にUSINGを使えるくらい?
その他はuser.nameがusr_nameになる程度でしょ。
よく見る規約だけど廃れ傾向だと思う
790 :
787 :2008/05/21(水) 14:25:43 ID:???
>>788 テーブル名が長いと大変じゃないですか。
長ければエイリアスを使えばいいと言っても、SQLによってエイリアス
の命名法が違うと混乱の元になってしまいますし。
Ruby on Railsなどのフレームワークが広まるとこの規約は
完全に廃れてしまうでしょうね。
>>790 >SQLによってエイリアスの命名法が違うと混乱の元になってしまいますし。
そんな程度では混乱しないっしょ?
昔はそういう命名よくやったけど最近はないね。 もっさりした、いかにも昔のやり方って感じ
今も昔も、そんなのは一般的ではないよ。
結合したとき、名前が衝突するカラムに対してエイリアスを設定するという作業が不要なので、俺も悪くないと思うんだが、あんまり見ないねぇ。 論理的、具体的にどこがマズいという意見も挙がってないし。 ORマッパ全盛の時代なので、余計なプリフィックスが付いてると美しくない、というのは個人的にあるんだけど。 あとは、似て非なるテーブルで、同じ意味のカラムに違う名前が付くのもNGな点かねぇ。
ORマッパが流行ってんのってJavaの世界だけ?
主系と待機系の2重構成にシステムを組む時は、主系が壊れた時にどのようにして待機系を主系にするのが普通でしょうか?
一般的な話が知りたいんなら、MS とかのサイトでクラスタサーバの 概要とか見ればいいんじゃね。 # スパッと壊れればいいけど、中途半端に壊れて両系起動してパニクルとか、 # 主系を修理後に副系から処理を戻すかどうかとかでトラぶりやすいから注 # 意した方がいい。
そういうテストはしていないよね メーカーや販社は値段が高いからクラスタサーバを入れるけど
797さんは同期はどのように取ることが多いですか?
>>793 集約テーブルの場合どうすんの?
id(primary) id id になっちゃうんじゃね?
>>795 .NETでもあるけど周りでは使ってる人見ないね。
C(非DBアクセス), VBer→.NETだとORどころかDaoすら知らない人が多い。
>>799 4大は全部レプリケーションサポートしてるでしょ。って誤解釈してる?
外部キーは相手のテーブル名入れるだろ
>>801 テーブル名の接頭辞をつけないなら
リレーション張るためのテーブルならidだらけになってしまうんでないかということ
そのテーブル自身のidをあらわしてないなら、 そのカラムはidって名前にならないだろ
>>804 >>787 >userテーブルならusr_id, usr_name, usr_email。classテーブルならcls_id...みたいに。
まあ、好みの問題のような気もするが、接頭辞を付けない方が良いような。
付けない場合は、通常、user.id と表現するが、 u.id や usr.id と 表現させる事も
簡単に出来る。
なんで、別にテーブル名が長くてもさして困る事は無いので、出来るだけテーブル名は
分かりやすい方が良い。
類似するテーブル名がたくさんあった場合、カラムに接頭辞がついている方が面倒。
また、カラムをユニークにするのは規模が大きくなればなるほど管理が大変。
中途半端に同じカラムがあったりするとイライラ増大する上に、
付いている接頭辞によって逆に惑う場合が発生してしまう。
そしてあんまり考えたくないが、テーブル名が変更された場合はかなり絶望的。
という事で、テーブルは、出来るだけそのテーブルだけで完結している方が良いと思う。
接頭辞をつけるという事は、そこに他のテーブルの意思が紛れ込んでいる。
まあ、それでもカラムに接頭辞を付けた方が見やすいと言うのであれば、
カラム名だけを変えたViewを作ればよいんじゃないかな?
って思うけど、どうだろ。
正規化の過程でテーブル分けた場合、違う名前だとややこしくなる、気がする。
>>804 そんなバカなことを言ってるとは思わなかった。すまん。
外部キーはXXXX_idとかにするよ、もちろん。
大体そうじゃなきゃCreateTableできないし。
>>802 VBやっててDAO知らないなんてことはないだろう
DAO違いな気がする。おそらくADOの親戚のことではない。
>>813 そうだな。バカだった。
>リレーション張るためのテーブルならidだらけになってしまうんでないかということ
こんなこというバカなんて存在しないハズだと、身勝手な前提を設けてしまっていた。
反省。
俺はテーブル名を素にしたプリフィックス付けたカラム名にしてるよ。 DBデザイナーみたいなソフトに読ませたときに、カラム名からある程度のリレーションを引いてくれるから。 確かに重複とか、ネーミングとか悩むけどな。 まぁ、ドキュメント類を都度、ちゃんとメンテしてないから↑みたいなことやる羽目になるわけだがw
>>815 同じカラム名じゃないと自動的にはリレーション貼ってくれないんじゃないか?
何によって、相互のカラムが関係あるとしているんだろうか。
各々のフィールドが絡むかどうかで...
カラム名にテーブル名のプレフィックスをつけるのって 東京都千代田区永田町という地名を 東京都東京_千代田区東京_千代田_永田町 にするようなものだろう。
別にテーブル名を付けている訳ではないだろ。
823 :
815 :2008/05/25(日) 02:56:42 ID:???
>>818 あ、ゴメン。ちょっと説明が足らんかった。
user_master
┌─┬──┬────┐
│id│name│yomigana│
└─┴──┴────┘
occupation_master
┌─┬──┐
│id│name│
└─┴──┘
user_occupation_index
┌─┬────┬───────┐
│id│user_id │occpuation_id │
└─┴────┴───────┘
↑こういうんじゃなくて↓こういう風にしてるよ
user_master
┌────┬──┬────┐
│user_id │name│yomigana│
└────┴──┴────┘
occupation_master
┌───────┬──┐
│occupation_id │name│
└───────┴──┘
user_occupation_index
┌─────────┬────┬───────┐
│user_occupation_id│user_id │occupation_id │
└─────────┴────┴───────┘
↑ってことを言いたかったのね。
好きにすればいいから・・・他所でやってくれ。
825 :
NAME IS NULL :2008/05/25(日) 15:21:56 ID:zyDCfy4f
DBを使ったシステムを構築するに当たり、実際のシステムでは、 1.入力時にデータをチェックして、DBにはまともなデータしか入れないようにする 2.DBに入れるデータは何でも許可して、データを使う時にプログラムでチェックする のどっちが一般的ですか? 私としては1の方策をとり、データの入力ミスが発覚した場合は入力プログラムに フィードバックすべきと思うのですが。
少なくともNOT NULL制約と外部キー制約はつけるが それ以上のことはやらないな
参照制約も使わん。
>>825 一般に、データチェックは入り口で行うのがセオリー
データチェックがあとになればなるほど、リカバリーが困難になる。
アプリでチェックしてるつもりでもチェック漏れ等は有りうるからなー。 「氏名必須なのに気づいたら氏名NULLのデータが大量にあった。発覚したのが3ヵ月後だから NULLになっている氏名の欄に何が入るはずだったか、もはやわからない」とかよりは 例えDBエラーでも最初の1件目で発覚してくれたほうが安全。 アプリチェックは当然必須だけど DB側でも最低限の制約は付けておくべきだと思う。
それこそ、NOT NULLくらいだろ。 キー以外のUNIQUEも場合によっては使うかも知れんけど。 参照とかチェックはまず使わんな。
性別とか年号とかあんまり増えなさそうなテーブルって作っておいた方がいいですか? 項目名のためだけにJOINしないといけなくなるけど
>>831 作ってもいいが、
JOINしないことを前提としたパラメータテープル扱いがいいと思う。
プログラム起動時に最初に読み込んでマップに取り込んでおく。
悩ましいのは帳票系のツールにダイナセット直結のものが多くて
JOINしないわけにいかないのがあるのがつらい。
>>830 参照整合性で悩むのは外部キー(参照先でないほう)に索引をつけるか
どうかなんだよな。1:nでnの数が多い場合は特に悩む。
833 :
NAME IS NULL :2008/05/31(土) 14:55:42 ID:6ka7bWrL
主キーとなるべきカラムにPrimarykeyでなく インデックスの設定で済ませる意味は確かにわからん。 インデックスって、厳密にはどんな制約かかります? 検索時に使用されるだけで、そのカラムに入る値については何の制約も与えないという のが個人的想像なのだけど、それはDBの種類によって変わってきますか?
設計上の概念が制約、それを実現する手段(実装)として索引がある。 主キー制約は非NULLのユニーク索引で実現される。 もうひとつ歴史的な背景としてANSI-SQLでPrimary Keyキーワードが DDLとして規格化されたのはかなりあと(ANSI-89くらい?)で 古い時代のRDBでは主キー制約をあらわすために非NULLのユニーク索引を直接使っていた。 >検索時に使用されるだけで、そのカラムに入る値については何の制約も与えないという NULLありの非ユニーク索引ならそうなるかな。
835 :
NAME IS NULL :2008/05/31(土) 17:21:44 ID:QpkHEgUM
主キーは何でも ID にして不正なデータを一杯突っ込んでいた馬鹿パッケージがあって困ってたんですが、このスレを見て分かりました。 駄目なことが流行ってて困りますし、そんな馬鹿にテーブル設計して欲しくないですねぇ。 必要があってID使いたいときは、主キーは自然キーで、別途ユニークキーでIDを宣言すればよいと思います。 何でもID派の人は論理的なユニーク制約の代わりを人間が実施しないといけなくなるんですが、そんな設計する奴がきちんとできるとは思えん。
また例のヤツか
同じ話題しか出せない=思考停止=理解力が無いだけ とも考えられるねw 単に粘着質なんだろうけど
839 :
NAME IS NULL :2008/05/31(土) 19:05:10 ID:QpkHEgUM
いいえ、違いますよ。 啓蒙ですよ。
DBMSに主キー発番させたいからID使います
このテーマは終結したんじゃなかったっけ?
暴れてるのは最初に質問した人とは別なのか。 かまってちゃんなんだろ。
>>839 みたいな頑なDB屋さんがいると結構やっかいだよねぇ・・・アプリ側の勉強ももっとして欲しいもんだ
質問に解凍するレスより粘着を煽るレスが多い件
>>835 それって主キーをIDにして、別途自然キーにユニーク制約つけとけばいいんじゃないの?
CASE文にサブクエリ書くのは汚いSQLになる
CASEによる
case by case と言って欲しかった
だれがうまいことを
850 :
NAME IS NULL :2008/06/26(木) 23:19:26 ID:9Bdxxe1P
質問です。通常は多対一(一対多)なんだけれども、例外的に多対多になる場合は どの様に対応されているのでしょうか? 例えば社員と部署を考えてみると、一般的にその関係は多対一ですが、現実には 複数の店舗を掛け持ちしたりとかで多対多になるケースもあるとかです。 きっちりやるなら関連テーブルを作って対応ってことなんでしょうけど、 実際には多対一で設計して運用で対応してるのが多いんじゃないのかな?って疑問です。 どうなんでしょう?
それを言うなら、「多対多で設計して運用(あるいはアプリ側)で対応」じゃないの?
>>851 レアケースで多対多になる場合は、関連テーブルを作っているのでしょうか?
というのが主旨の質問です。この例ですと、多対一の設計にして、社員を重複登録等にして
関連テーブルを作成しない対応をするのが多いのでは?というものです。
>>850 兼任してるのがすごい稀なら、ダミーの社員作って対応してる例はあったよ。
ダミーの社員には元の社員の社員番号 + 追い番付けといて、
select * from 社員テーブル where 社員番号 like 'xxxxx%'
みたいにして全ての所属部署を取得するとかしてた。
>>853 レスありがとうございます。
すいませんが取り込んでしまいましたのでレスは後ほどいたします。
「例外」をノーマルとして扱うものを最初から設計するのがシステム作りの基本。 このケースでは「多対多」でつくる。 そのほうがシンプルな構造になるし、あとあとの管理も楽。 部署コード+社員コードからなる担当テーブルを作るってことになるのかな? ただし、「例外」を実装するのにコストがかかるケースでは別途考える。
>>855 > 「例外」をノーマルとして扱うものを最初から設計するのがシステム作りの基本。
費用対効果とかトレードオフって知ってる?
N:1だろうとN:Nだろうとなんでもかんでも 関連テーブル作っておけばいいよ。
>>856 基本N:1の設計に例外でN:Mサポートを作りこむのと、最初からN:Mの設計に
通常N:1とする制約を作りこむのとでどっちがコストが低いのかという話だろ。
で、費用対効果というものを知っているとどっちの結論になるの?
>>858 いや、つっこまれてるのはその話じゃなくて、最初の1行目でしょ。
この場合、関連テーブル作っておくなんて「例外」でもなんでもない。
「エンティティ」って言葉の通りだよ。
>>858 > で、費用対効果というものを知っていると
状況も考慮せずに、「どっちの結論になるの?」なんてバカなことを言わなくなる。
>>856 その下に、
> ただし、「例外」を実装するのにコストがかかるケースでは別途考える。
って書いてあるのが目に入ってないのは何故だ。
そんなものは別途考えるんじゃなくて、最初に考えることだから。
一部のデータだけが多対多、なんてのを例外扱いするのがまず違和感。 その上、例外をノーマル扱いするのが基本、って言い方すれば コスト意識ねーなーってつっこまれるのもしかたない。 まあ気持ちは一緒なんだと思いますよ。言葉のあやみたいなもんかと。
はい、言葉のあやです。 スキップ!スキップ!
「例外的に」としてしまうのは素人 客が「レアケースだから」と無意識に無いことにしてしまっているのを引き出す仕事なのだから、この意識は重要だと思う
相手を信じることによって信頼関係って成り立ってると思うんだ。 俺は客が言うことを信じるぜ!
多対多の時は関連テーブル作るのは分かるけど 多対一の時に関連テーブル作らないとしたらどうやって表現するんだ?
テーブルの中に1個だけサイズが大きなカラム(MySQLのtext型とか) がある場合、それだけ分離したテーブルにすることってよくありますか?
そのカラムのせいで固定長が崩れるなら分離する
分離する意味がないからしない
データを分析して全体の数%にしか巨大なテキストがあるとか言うなら 分離するとかするかもしれんが、常に一定量のテキストがあるなら、 分離する意味が解らん。
RDBのTEXT型がVARCHARかCHARかで多少話しが変わってくるかもしれんが、 その会社でMySQLで鯖の容量とレスポンスとjoinのコストを総合的に判断して 分けた方がいいと判断したから分けたんじゃね? 「テキスト型は分離する」なんてマニュアルはないぞ。
>>873 パフォーマンスチューニングっていうのは「HDDのシークをどれだけ減らすか」
ということだから、TEXTフィールド分割は一つの手段だけども、基本は
「計測しろ」
だ。
計測しないとわからないなんて設計者としてどうなの?
DBに関しては予断が一番危ない。 DBMSとバージョンと諸条件まで合わせないと違う結果になることが多い。 事前と事後の測定なしでちょろっとチューニングを頼まれるのは辛いし危険、基本的に断ってる。
>>873 ここでいうTEXTフィールドはCHAR型、VARCHAR型の文字フィールドでなく
最大2^16文字格納できるtext型のフィールドなんだろう。
index検索しかしないのであれば、別テーブルに分ける必要はないが、
データをスキャンするような検索がある場合は、別テーブルにしたほうが無難。
TEXT型というのが文字タイプのラージオブジェクト(CLOB)の場合は、 レコードにはポインタだけで本体は専用の別領域に格納するものが多い。 例えばMSSQLは2000まではこれであったが、 2005からはオプションでデータがブロックに納まる規模ならレコード本体にしまうようになった。
>>876 大量データのシーケンシャルサーチとインデックスサーチみたいに、どう考えてもこっちの方が速いだろう、というケースでない限り、事前の予測はあてにならない。
逆に、その予断のせいで酷い設計になるケースも少なからずある。
ある程度の予測ができないと設計はできない
実際に設計する時に要件の規模を聞いて、ダミーでもいいので 重いデータとか作って計測するけどな。 ショボイ案件と言うと語弊があるが、データの量が少なくて 事前の予測がハズしても体感的に大差ないと言い切れる ケースだと計測しない場合はあると思うけど。
運用中の改修で計測できない場合はどうすんの?
運用中の改修って本番稼働中のシステムに対してテストとかせずに 本番環境を直接変更、本番一発稼動の事を言っているのか? 仮に障害対応とかマッハな緊急対策な話は別として、 そんな対応に設計も予想もクソもないと思うが。
>>885 要緊急対応→お願いっ!
通常対応→模擬本番環境用意して計測。
意味あるデータを取れる模擬環境を持っているシステムってどのくらいの 割合なのかな? 二重化されているシステムならスタンバイ側を利用できるかもしれんが。
>>888 きっちり同じのは見たことないな。実運用では、
「テスト系で20分だったからまぁ大丈夫なんじゃね?」
くらいで済ますことが多かった。
890 :
NAME IS NULL :2008/07/13(日) 13:14:48 ID:IMrAjHtQ
mixiのコミュニティの様にユーザが自由に作成可能で、 作成される数が1000-1000000まで想定される掲示板の設計を考えています。 1.1000テーブルを作成する(コミュニティ数分だけテーブルを作る) 2.1つのテーブルで管理をし、インデックスを適切に貼る 管理面は間違いなく2番の方が楽ですが、現実問題として1番の方法が 適切なパターンもあるでしょうか?
コボルで開発する場合とか?
>>890 普通の RDBMS 使えるなら環境ならまずないと思う。
1テーブルあたりのデータ量の上限がやけに低い変態 DBMS とか、
プロジェクトの方針や要件定義で複数のコミュニティのデータを
1つのテーブルに入れるのはまかりならんとかなってるのならそ
の限りではないけど。
mixiのように巨大なものになってくると、一般的な話とは違ってくるだろうね。
テーブル分割の話が出てくるんだろね。 水平分割、垂直分割・・・('A`)
mixiはOSがfedoraでRDBはMySQLだから、ちょっと工夫してパーティション切ってるとオモ。 楽したかったらDB2/400やOracleみたいにOSが半自動的にクラスタや パーティショニングしてくれるRDBMS使うとか。
896 :
NAME IS NULL :2008/07/14(月) 00:00:10 ID:FB0wjp69
>>892-895 大変参考になりました。ありがとうございます。
1番の方向で設計して、後は保守や拡張で対応をしたいと思います。
後は営業の口先で対応すればいいと思います。
記事やコメント相互の関連性がほとんどなしでいいなら集中して管理する意味はほとんどない。 ぶっちゃけ2ch方式ならDBさえいらない。 スレに対してコメントを追記すればいいし上限1000コメントなら検索は先頭からのサーチで十分。 それでも1サーバで管理できる範囲なら1テーブルにぶち込んだほうが楽。 2サーバ以上分散させるなら、それぞれ独立した板に分けてしまったほうが楽だし負荷分散もしやすい。 あとはnewsgroupのようなやりかたもあり。 データの同期が遅れることはあるが記事相互の関連は取れるうえ負荷分散に対応できる。
テーブル名について質問です。 以下のような3つのテーブルを作っています。 □会社テーブル ・会社コード ・会社名 □所属テーブル ・所属コード ・所属名 □会社and所属テーブル ・会社所属コード(代替キー) ・会社コード ・所属コード □社員テーブル ・社員コード ・社員名 ・会社所属コード ここで気になっているのが、"会社and所属テーブル"というテーブルの名前なのですが、 いい名前がどうしても思いつかないのですが、どのようなテーブルの名前にするのが適切でしょうか?
とりあえず日本語はやめような?
>>899 仕事だったら上司かお客に聞けばいいし、
学校の宿題なら好きに汁。
おそらく宿題だとは思うが。
いまどき、英語にこだわる事も無いんじゃないか。
と言うか、使えないくせに無理やり分け分からん単語を使われるぐらいなら、
日本語に統一してある方がよっぽど良いが。
俺は英語が出来ないから、日本語をじゃんじゃん使う。
最近ではコードの関数名・変数名からして日本語だし。
いや、便利になったものだよ。
>>899 その法則であれば、自分なら会社詳細テーブルか所属詳細テーブルかな?
どういう意図でそのテーブルが必要なのかを明確にすれば名前は自ずと決まるけど。
日本語はサ変と複数形が困る
>>899 所属名というのは部署名のことですか、そうだとしたら
□会社テーブル
・会社コード
・会社名
□部署テーブル
・会社コード
・部署コード
・部署名
□社員テーブル
・社員コード
・社員名
・会社コード
・部署コード
で、いいんでないかい?
普通に「会社所属テーブル」って名前で良さそうだが。 所属ってのは「正社員」とか「派遣」とかの区分のことかな?
907 :
NAME IS NULL :2008/07/17(木) 00:00:22 ID:va5rM8gD
ADO.NETの自動コード生成だと日本語があると変なコードになるから 使わないようにしてる。
908 :
NAME IS NULL :2008/07/17(木) 06:04:32 ID:uqRdek/R
>>905 会社と部署との関連がなくなるだろw
テーブル設計自体は、
>>899 で問題ないと思う。
で、名前は
>>902 のいっているとおり、どういう意図でそのテーブルが必要なのかを明確にすれば名前は決まるわけだ。
会社and所属テーブルが何のために必要かというと、会社と所属の関連ということになるわな。
だから、名前は、会社別所属一覧テーブルでおk。
>>900 おっさんはあっちいけw
最近は普通に日本語使うんだよ。(英語使うことのほうが多いけど)
フリー(偽装派遣)なんでいろんな現場を転々としてるが 日本語使ってるのは1回しか見たこと無いな。 20万行ぐらいあるストアドパッケージとか、いろんな意味で滅茶苦茶なプロジェクトだった。
>>909 それは日本語とは無関係のような・・・
それはともかく、日本語のオブジェクト/フィールド名を使っているデータベースでまともなものに出会ったことがないな。
大手が関係しているプロジェクトはみんな英語だったし。OBCの内部DB構造も英語。
>>907 同意。
>908 >最近は普通に日本語使うんだよ。(英語使うことのほうが多いけど) 少数派なのに「普通」? あれか、「普通に美味しい」とかいう「普通」ですか? 俺は日本語、2回見た。両方ともバカな設計だった。 バカ設計と日本語である事と無関係なのは判ってるんだけど どうにもこうにも、うーん。
マルチバイト文字を使うかどうかなら環境が許すならやってみたいものだ。 以前のプロジェクトで漢字OKというふれこみだったのだが、 漢字の第2バイトに'\'があったらバグが出るという代物だったのでやめた(笑 ところで外国企業や外資系の開発でもない限りローマ字で日本語を使うことは多いのだが、 最近は訓令式が主流なのだろうかヘボン式育ちとしてはちょっとすわりが悪い。
>>913 訓令式の方がルールがシンプルでいいという気がする。
普段のローマ字使うときはヘボン式なんだけどね。
こちらは適当でいろいろ混ざってる。特に英単語を使えという指示もない。 ただ外来語は本来のつづりでというルールはあるな。 テレビはTVやtelevisionにしてterebiはよしてくれということらしい。 なるほどterebiはさすがにアホっぽい。
>>915 外来語は英語の綴りでないと読みにくいね。
あといくつかの一般的な英単語(name, dateなど)もある程度規則をつくってる。
審判はヘボン式でshimpan
DB勉強中の学生から質問。 >905 の、社員テーブルに会社コードいらないと思うんだけど それじゃまずいの?
>>919 >>899 に「会社and所属テーブル」があるのは何故かっつーと
会社と所属がn対nだからであろうと考えられる。
とすれば部署から会社を特定することはできない。
よって部署と会社両方を社員テーブルに持たせる必要がある
大学と学部みたいな通り一遍みたいなのならわかるけどなー ○○大学××学部 たとえば大きな会社って、いろいろ部署ない? 捜査一課とか庶務二課とか。 翻って小さな会社の場合、部署なんて無い方が多いと思うな。 会社によっては、他には無いような課とかあるんじゃないかな? 特車二課とか? そういうのでもあのテーブルにいれるの? あと、社員の所属が会社にないとか発生しない?
捜査一課www
923 :
922 :2008/07/18(金) 01:06:54 ID:???
失礼。悪気はない。
>>921 こまかい仕様は
>>899 にしかわからない。
所属が部署を意味するかどうかさえわからん。
ただし、他には無いような課だからテーブルに入れないなんて理屈は無いし
社員の所属が会社にないとかもありえない(無いものを使うな、または無いなら作れという話でしかない)
そもそも
>>899 の「所属」って、なんのことなのかね?
複数の会社にまたがる可能性のあるグループで、
すべての社員は必ずそのどれか一つに属している?
プロジェクトみたいなものなら複数の会社でってことも
考えられるけど、複数のプロジェクトに参加する社員も
普通にいるからなぁ。
>>908 >>920 は理解できているみたいだが。
最近の流行はシステムに合わせて会社のルールを変えさせることだよ
所属=国とかだと、まあ意味は通るでしょ。
929 :
NAME IS NULL :2008/07/19(土) 04:17:33 ID:cVCG1agQ
>>926 >そもそも
>>899 の「所属」って、なんのことなのかね?
会社の中の所属でいいと思うよ。
所属が会社を横断するようなものであれば、会社and所属テーブルというものが存在してはいけない。
してはいけない。?
>>919 子会社を持つグループ企業などの社内システムには必要。
(よくあると思うけど)
どこの会社に所属している社員かわからなくなるから。
簡単な社内システムを作る事になり、 DB設計の担当として、現在論理DB設計を行なっております。 上司の方からアドバイスを頂いた際に、 「トランザクションテーブルから、マスタテーブルへの関係を引く場合は、 トランザクションが親。マスタのIDに外部キーを設定するように」 と言った内容のご指導を頂きました。 トランザクションへ外部キーを設定する物とばかり思っていまして、 先に記述した上司様からの話は聞いた事がなく、 google等を利用して調べても、参考になる物がほとんど見つかりません。 どなたかマスタを外部キーにする事の理由や、意味、 参考になるサイトのURL等をご教授願えませんでしょうか。
一概に言えんのだがトランザクションテーブルやらマスタテーブルって 単語が出てくる時点で、ダメダメな悪寒。
>>934 そんな止めを刺さないでください・・・。
今年入社したばっかで、何かの間違いor知らない考え方が存在すると思い、
質問をしてみたのですが、諦めたほうが良いのでしょうか。
>>935 そうなのですか?
正確にはマスタ、トランと呼称しておりましたが、
そういう問題とはまた違う問題ですか?
少なくとも、一般論ではないらしいと確認が取れたんだから、あとは上司に聞け。 大技林にも載ってない物凄い裏技があんのかも知れないだろ。 報・連・相 って学校で習わなかったのぉ? ゆとりちゃん。
>>937 了解しました。
本日、上司の方に確認を取りに行こうとしたのですが、
ちょっと忙しい、との事でお話が出来なかったのです。
もし知らぬ何かがあるのなら、予習しようかと思いまして。
確かに一般的ではないようですし、
もうドキュメントを探す作業も疲れましたので、
2行目を希望にして、明日を迎えたいと思います。
本日はどうもありがとうございました。
明日、\(^o^)/オワタという報告・・・というか愚痴を吐きに、
またここを訪れるかもしれませんが、その際は慰めて貰えると嬉しいです。
それでは失礼致します。
別に珍しい話でもないと思うけど。 例えばネット通販だと、まず販売実績ありきで 売上テーブルにない顧客が顧客マスタにいたらそれはおかしい。
忙しくてちょっと言葉を間違えただけじゃないの?
単純に聞き間違いとか、使う言葉の意味が両者で統一されていないだけかも。 マスタテーブルがトランザクションテーブルへの参照を持つようなことって、少なくとも基本的な設計ではないよね
>>932 そう言うことじゃなくて、
社員テーブル.部署コード ⇒ 部署テーブル.会社コード ⇒ 会社コード.会社名
で会社名がわかるんだから、社員テーブルになくてもいいんじゃね?
と言うことだと思うけど。
>>933 COBOLそれもマグネットテープ時代の用語だと
マスターが主データで
トランザクションは更新データ(キー99を削除、キー88のデータをXXに更新といったデータ)と
いう意味で使っていた。
上司の年齢が50台以上なら要注意な。
>>933 まあなんだ、外部キーをリファレンス先のキーと混同することはありがちなこと。
946 :
NAME IS NULL :2008/07/26(土) 03:24:39 ID:oNJlmvYG
トランザクションテーブルは、サロゲートキー派が多いが、 伝票データのとかの主キーをDBMSで発番(連番)すると、 DBMSによっては同一ページに対するロックが競合しまくって パフォーマンスが悪くなりませんか?
>>946 PAGE LOCKを使ってなければ問題にならない。
もし最大値+1の処理やってるならそりゃ論外。
>>946 正直何を心配してるのかさっぱりわからない。
ナチュラルキーならロックが起こらないと?
949 :
NAME IS NULL :2008/07/26(土) 12:25:21 ID:oNJlmvYG
主キーがクラスタ化インデックスになる場合、 連番だとPAGE LOCKのかかる範囲が分散しないのではという疑問です。
とりあえず、
>>946 のレベルではそのへんのパフォーマンスのことを気にしても
しょうがない。へたに「工夫」して変な設計にしてしまうのがオチ。
とりあえずどのDBMSの話をしてるのかはっきりしろ。
ロックが競合しまくってパフォーマンスが悪くなったとしても 運用上支障がでる程度のパフォーマンス低下なのかどうかが問題
>主キーがクラスタ化インデックスになる場合、 といってるからMSSQLサーバーなのだろうが、 そこでPAGE LOCKがかかるとするとver.7より古い? DBMSのチューニングは3犠牲にして5性能をアップするようなことをするもので、 等価ではないがある程度のトレードオフはつきもの、 一部だけ取り上げてどうこういうのはどんなものか。 例えばクラスタ索引のfill factorに十分余裕を持っている場合 挿入するキーが分散していればパフォーマンスはあがるだろうが、 fill factorが100%に近ければあっちこちでページ分割が起きてパフォーマンスは下がる。 クラスタ索引のfill factorはその特性からディスク容量への影響が大きく余り低く出来ない。
テキストが PRIMARY KEY なテーブルってどう思う? たとえば CREATE TABLE tbl ( name TEXT PRIMARY KEY
TEXTの実装がDBMSでまちまちだしなぁ
あいまいな日付を格納したいとき 日付型使ったらいいか悩む 文字列型にするしかないのか
どんな検索やソートをするかにかかってる。 俺は日数や時間の計算をSQLでやりたいから DATETIMEを使うことが多い。
>>956 あいまいな日付って、そもそもどんなのを想定してるの?
「8月」「8月上旬」「8月第1週」「8月4日前後」とか?
そういうのってさあ、業務側では、月末扱いとか翌月初扱いとかなるもんじゃないの? 無理にDBに曖昧なデータ入れる必要があるのか?
あいまいとは何か
961 :
NAME IS NULL :2008/08/04(月) 23:25:33 ID:qp/dDDtF
テーブル設計について質問があります。 某物流会社のシステムを作っているのですが、 そのシステムではログインに関して以下の要件があります。 ・システムにログインするためには、社員番号とパスワードを入力する必要がある。 ・システムには、サブシステムが5つほどあって、役職によってそれぞれのサブシステムにアクセス可能かどうかが決まっている。 ・ただし、あるサブシステムにアクセス権限のない役職でも、特定の社員だけ一時的にのサブシステムにアクセス可能にすることもできる。 これらの条件を満たすために、以下のテーブル設計を考えてみました。 □社員テーブル ・社員コード ・社員名 ・役職コード □役職テーブル ・役職コード ・役職名 □権限テーブルA ・サブシステムコード ・役職コード ・権限テーブルB ・サブシステムコード ・社員コード あまり、テーブル設計の経験がないので、この場合はこうするべきだ!とか、こっちのやりかたの方がいいよ!みたいな 意見をお伺いできればなと思います。 よろしくご教示願いいます。
それであってる。 申し分ない
a
>>961 もし、役職が課長の人だけアクセスできるサブシステムについて、山田課長だけアクセスさせたくない場合を考えた場合、
権限テーブルBに、山田課長以外の課長を全員登録する必要があると思うんだ。
だから、アクセス許可レベル(権限なし、レベルA、レベルB、etc...)を追加したらどうだろう。
□権限テーブルA
・サブシステムコード
・役職コード
・アクセス許可レベル
□権限テーブルB
・サブシステムコード
・社員コード
・アクセス許可レベル
小規模のシステムなら、
>>961 さんの設計で問題ないと思うけど、
ある程度規模が大きいなら汎用的に作るべきだと思うんだ。
>>962 昔、中学の先生がいってました。「意見が無い奴は、知性が無い。」
>>964 何かしらケチをつけなきゃ意見が無いって考えか。歪んでるな。
賛同したら負けだとか思ってそう。
言われても無い仕様を追加すりゃ、そりゃいくらでも付け加える要素はあるさ。
>>964 で実現できない(そして誰も要求していない)仕様はたくさんあるだろ。
まあありがちな病気だから。
>>967 YAGNIの法則は、大規模システムでは向かない
個人的にはそういうのはOSレベルで制御した方が あとあと後悔しないと思わなくもない。 現に後悔しているシステムを見たことあるので。 DB2/400みたいなヤツだと管理とか楽。 YAGNIはあれはあれでちゃんと意味があるから、出来るなら実践すべきだと思う。
意見が無い奴は、知性が無い。 うちのプロジェクトがグダグダな原因は、これだ。 どいつもこいつも他人の仕事に首突っ込みすぎ。 決まるものも決まらない。言うだけ言って責任取らないし。 いかにも教職員って感じの思想だよね。最悪。
有用な意見は歓迎だが、無駄に話を引っ掻き回すのは勘弁してくれってやつだな。
>この場合はこうするべきだ!とか、こっちのやりかたの方がいいよ!みたいな意見をお伺いできればなと思います。
と聞いてるのだから、それで十分と答えるのも、聞かれたこと以上のことを答えるのも回答として成立する。
>>969 OSやDBMSレベルのアカウントを使うか、アプリケーションで独自に持つかというのはいつも悩みます。
>>964 >962は明確に肯定しているから意見が無いのとは根本的に違う。
汎用的に作るならいっそ役職と権限を独立させて
□社員テーブル
・社員コード
・社員名
・役職コード
・権限コード
□権限テーブル
・サブシステムコード
・権限コード
としたほうがすっきりすると思う。
>>964 は煽った割には
たいした話をしてないのがだめだったな。
つかこれ、YAGNIとかいうレベルじゃないでしょ。
頼まれもしないのによかれと思ってやってみました、って奴。
>>973 ときどき、なぜかユーザーより自分の方が「ユーザーの真の要件」を理解しているという
妙な自信を持った開発者がいたりするもんな。
そんで、ユーザーが「役職の権限を変更しても反映されない社員がいるんだけど…」とか
質問してくると、小馬鹿にしたような態度で「ちゃんとアクセス許可レベル設定しましたぁ?」
とか言ったりして。
まあ所詮2ch、仕事じゃないんだし、 こんなケースも考えられるよって出すのは 別によかったと思うんだけどさあ、 最後の1行でそんなフォローする気なくす。
>>971 >OSやDBMSレベルのアカウントを使うか、アプリケーションで独自に持つかというのはいつも悩みます。
サブシステムが5個しか(?)ないなら、サブシステムをスキーマ毎に分けて、社員テーブルを
OSのユーザープロファイルにすれば、そういう社員テーブルや役職テーブルとか無しで
>>961 の要件に対応可能だけど。
そのうちアクセスログやらジャーナルとか、パスワードは定期的に変更とか英数字まぜこぜじゃないとダメとか、
過去5回とパスワード文字列が一致したダメとかシングルサインオンしたいとか要望が出た時に
OS任せにしておいた方が絶対に楽。
既に複数のサブシステムがある訳だし、
>>976 が完璧な答えだと思います
>>976 楽かどうかってのは一概には言えないと思うよ。
というか、将来出てくるかの知れない(今は分からない)要求に備えると
いうことならOS任せにはしない方が楽だと思うが。
例えば「パスワードを忘れたときに、メールでパスワードを送ってくれる
ようにしてくれ」とか、「かわりに、あらかじめ登録しておいた質問に
答えることでログインできるようにしてくれ」とか。
OS 任せなので、そう言う要求には応じられません。 と言う予防線なのでは? (w
なるほど、そりゃ楽だw
>例えば「パスワードを忘れたときに、メールでパスワードを送ってくれる >ようにしてくれ」とか、「かわりに、あらかじめ登録しておいた質問に >答えることでログインできるようにしてくれ」とか。 必要になった部分だけ自前で設計&実装すればいいのでは? レンタル鯖で激しいOS制御(?)が出来ない環境ならともかく、 自前で所有する鯖だったら、自前で実装する必然性が解らん。 自前で実装すると後からボロボロとなるケース多いし。 あと、「OS 任せなので、そう言う要求には応じられません」は ホント便利。w 最近パスワード絡みの案件で後から苦行を強いられた身としては 「将来出てくるかの知れない(今は分からない)要求に備える」と言う意味に おいてもOS任せにしておいた方が楽なケースが多いとオモ
>>981 >> 例えば「パスワードを忘れたときに、メールでパスワードを送ってくれる
> 必要になった部分だけ自前で設計&実装すればいいのでは?
今時平文パスワードをほいほい取得できる OS なんて無いと思うが。
結局パスワード周り、つまりログイン関連全てに手を入れる羽目になると思うぞ。
>今時平文パスワードをほいほい取得できる OS なんて無いと思うが。 その考え方からしておかしいと思うが。 なんで取得する必要があるのだろう? ユーザーがパスワードを忘れた場合はランダムなパスワード、もしくは超簡単なパスワードで で初期化して次回ログイン時に強制的にパスワード変更させる、って運用しているのが多いだろうに。
>>983 いずれにしても、OS認証を採用した場合はそのような要求には応えられないわけだ。
その要求がおかしいかどうかを決めるのはユーザー(要件を決定する側)の仕事だろ。
典型的な
>>974 だな。
985 :
NAME IS NULL :2008/08/07(木) 03:12:30 ID:Ozd0b/vL
正規化のスレみても、 なんでも正規化すればよいわけじゃなく、 故意にしないっていうのも手っていうレスがちらほら。 やっぱり場数踏むしかないの? 設計って。 良い参考書あれば教えてほしい。
>いずれにしても、OS認証を採用した場合はそのような要求には応えられないわけだ。 いや、答えちゃいけない要求だろ。ソレ。 それだとパスワードをハクられまくりの仕様じゃん。w 後任者に「ヴァカが設計した」と言われる典型だぞ。 事の善悪の判断も出来ないなら設計しないがいいと思うが。
なんか脱線しそうだな
頭悪いくせに突っ込まれると言い返さずにいられないいつもの奴だろ。 まともに相手すると話を逸らしまくるから議論がグダグダになるんだよな。
反対意見が無いと知性がない訳だからな。 しょうがない。
>>985 答えとしては、場数踏むしかない。
でもまずは、可能な限り正規化して設計すべき。
何個かやってると、しない方がいいケースがわかるようになるから。
でも、しない方がいいケースなんてそんなにないと思う。
>>986 > いや、答えちゃいけない要求だろ。ソレ。
わかりました、他のベンダさんをあたってみますわ。
正規化しすぎで困るってどうせ細いマスターが増えすぎて 結合のクエリ書くのがめんどくさいとかそんな理由だろう?
面倒なんじゃなくて、高速な抽出が難しくなる場合も結構あるよ。 どうやっても非正規化のほうが速いとか。
実績系のデータとか、業務的に必要なケースも普通にあるよね>非正規化
残高はサマリ作っとかないと軽く死ねるしなー。
>>992 検索する側からみれば、そういうことになるかもしれない
でも、データの修正・削除などのメンテナンスのコストを考えると
正規化したほうがよろしい
そんなもん、メンテナンスツール作れ。
夏だなぁ・・・で次スレは?
こえてゆ〜く〜はるか〜すれ〜よ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。