DB設計を語るスレ 4

このエントリーをはてなブックマークに追加
1NAME IS NULL
2NAME IS NULL:2011/07/05(火) 17:18:59.72 ID:???
PRIMARY KEYの指定されているテーブルに、
他のNOT NULL UNIQUE制約を持つカラムを入れるべきではありませんか?

例えばこんなテーブルです。

アルバムテーブル
画像id NOT NULL PRIMARY KEY,
画像名 NOT NULL UNIQUE,
サムネイル名 NOT NULL UNIQUE

これの構成を変えるとどんな感じにすればいいでしょうか?
画像名が決まればサムネイル名も決まるというルールを作ることも可能です。
3NAME IS NULL:2011/07/05(火) 19:58:50.74 ID:???
>>2
その項目がNULLが入って困るならNOT NULL制約をつければシステムが保証してくれる
その項目がユニークであるなら、UNIQUE制約をつければシステムが保証してくれる
すくなくとも本番DBなら付けない理由がないんだが?

>これの構成を変えるとどんな感じにすればいいでしょうか?
なぜ構成を変えるのか、構成を変えてどうしたいのか全く分からんのに
どんな感じも何もないわ。好きにしろとしか
42:2011/07/05(火) 20:14:52.26 ID:???
>>3
テーブルにプライマリキーを2つ以上定義してはなりませんが、
NOT NULLでUNIQUEなカラムはプライマリーキーと同義です。
なので、プライマリキーを指定してるテーブルには、
NOT NULLでUNIQUEなカラムは含めるのは設計的に正しくないのかな?と思って質問しました。

それで、もし正しくない場合構成をどうすればいいか教えて欲しかったのです。

回答内容から付けても特に設計に問題はないと判断させていただきます。
5NAME IS NULL:2011/07/05(火) 23:43:07.77 ID:???
テーブルには複数の候補キーが存在し得る。
かなりはじめの方で学ぶはずのことだが。
6NAME IS NULL:2011/07/06(水) 00:53:51.25 ID:???
インデックス張るのは重くなってからのほうがいいんでしょうか?
7NAME IS NULL:2011/07/06(水) 01:51:12.39 ID:???
それはただの対症療法で、
設計なんてできない人間が場当たり的な手段として考えること
86:2011/07/06(水) 02:11:21.70 ID:???
やっぱそうですか。
自分は設計できない人間なので何にインデックス張るのかがよくわかりません。
とりあえずソート基準になりそうなものやselectで頻繁に指定するものにはってます。
DB設計は本当に難しいですね。
9NAME IS NULL:2011/07/06(水) 15:00:28.23 ID:???
最近のDBMSなら、ここにインデックス張ると良いよと教えてくれるものもある
あてになるのかどうかはしらんが
10NAME IS NULL:2011/07/07(木) 15:10:13.57 ID:???
ビューの作成について質問お願いします。
ビューは導出関係で、SELECT文をデータベースに保存したものという説明がなされています。
つまりSELCTで複数項目を選択して取り出すケースではビューを積極的に作ったほうがいいのでしょうか?
SELECT a, b, c FROM tableがSELECT * FROM viewに変わるんですよね?
11NAME IS NULL:2011/07/10(日) 12:00:40.88 ID:???
セキュリティ的な要件でもなければ、俺ならその程度のSQLでビューは作らん
12NAME IS NULL:2011/07/10(日) 12:23:38.94 ID:???
そういうビューがあった方がいいという時点で
テーブルをそうすべきでは。
複数のテーブルを結合したSELECT文こそ
ビューにするものだろう
13NAME IS NULL:2011/07/13(水) 02:57:16.53 ID:???
プロフを参照するとこの方、銀歯を作る仕事をしていたそうで(微笑)
道理で、物作りの厳しさ、商売の難しさどれを取っても何一つ理解しておらず、
突っ込み所満載なわけです
しかも過去形である所を見ると景気に関係なく黙ってても患者が来る、
病気や虫歯を直す商売でさえ勤まらなかったということでは(笑)
銀歯と金型では要求される精度も品質もまるで違います
質問者が何を作りたいのかが明らかにされていないため分かりませんが
趣味のようなもの、とおっしゃるなら趣味の掲示板で相談されたらいかがでしょうか
その分野の同好の士が良い方法を知っているかもしれませんから
もちろん、趣味の世界といえども技術は只で教えてもらえるほど甘くはないという事を肝に銘じておくべきでしょう
14NAME IS NULL:2011/07/13(水) 22:15:57.85 ID:???
外から入力を受け付ける場合%はエスケープしたほうがいいんでしょうか?
LIKE検索ウインドウでワイルドカードとして使用を許可したほうがいいのか悩んでいます。
というより使ってるプログラムのデータベースエスケープ用関数が%をエスケープしないので、
そのままでもセキュリティ的には問題ないのかなぁと思ってるんですが、
色々サイトまわってると%もエスケープするべきだと書いてるところもあるのでどっちなのかなぁと。
使用DBはsqliteです。
15NAME IS NULL:2011/07/14(木) 00:58:09.73 ID:???
>>14
それはホストアプリの問題だから、使ってるホストアプリのスレで聞いてください

使い方の問題もあるがな
入力した人がワイルドカードとして%入力してるならエスケープしちゃだめだろ
逆にパーセント文字を表しているならエスケープが必要になるだろ

判断がつかないならエスケープしとけ
16NAME IS NULL:2011/07/16(土) 05:09:19.36 ID:zVyql7Ng
現在のunixタイムを入れるカラムがあるんですが
それを基準に色々したりしますが
idと同じように上から下へだんだん増えていく数字です
こういうのにもインデックスはいるんでしょうか?
17NAME IS NULL:2011/07/16(土) 08:49:20.27 ID:???
つ 2038
たぶん頭で考えてユニークなデータだから大丈夫だろうと思ってても
意外な落とし穴があるといけないからユニークなIDをつけとくクセをつけた方が余計なリスクがないんだということだと思う
18NAME IS NULL:2011/07/17(日) 03:49:45.65 ID:???
いらないレコードをSELECT文のパフォーマンスのためにどんどん削除すると、
データベースに断片化が起きますよね?
それを掃除するのがVACUUMであってますか?
だいたいどのくらいDELETEしたらVACUUMすればいいのでしょうか?
VACUUMや大量のDELETE処理で時間がかかっても、
その間SELECT文はスイスイうけてくれますか?
19NAME IS NULL:2011/07/17(日) 11:20:44.05 ID:???
ぽすぐれスレいけや。
20NAME IS NULL:2011/07/19(火) 21:51:10.43 ID:???
これで独立できる

売るものはスマートフォンアプリ WEBサイト運営
サーバーはクラウド VPS
電話はスマートフォンSkype
オフィスは地方にプレハブ型の格安高性能オフィスを建て(300万〜500万)
レンタル自習室&シェアオフィスで収入を得ながらそこで開発する
http://tinyurl.com/43xmk7m
http://tinyurl.com/3mopkfy
21NAME IS NULL:2011/07/23(土) 13:13:55.40 ID:dlvFoJHC
テーブル名の付け方でかなり悩みます・・。

会員テーブルがあって、会員の種類に、一般・ビジネス・管理者など
それぞれ用途が異なります。

最初は1つのusersテーブルに区分を付けてまとめようとしたのですが、
各会員のカラム構成が違うので、独立したテーブルにしようと思いました。
その場合、
users → 一般会員、admin_users→ 管理者、biz_users→ビジネス会員

と言うのを考えたのですが、変じゃないか?と悩んでおり、
どうするのが普通(一般的)か気になり、質問しました。
22NAME IS NULL:2011/07/23(土) 14:04:05.84 ID:???
>>21
DB設計を語るスレ 3
> 910 名前:NAME IS NULL[] 投稿日:2011/06/27(月) 12:30:37.62 ID:72GVkR7S
> あるWebシステムで「管理ユーザ」「一般会員」「ビジネス会員」を
> 1つのusersというテーブルでまとめていました。
>
> 私はこれまで、
> 「admin_users」「users」「biz_users」と3つのテーブルを作って
> それぞれの会員用途で分けていたのですが、
> 前者のように、1つのテーブルでアカウント情報を
> まとめるケースって多いのでしょうか?
23NAME IS NULL:2011/07/23(土) 17:55:36.26 ID:???
それちゃんと正規化されてないんじゃね
24NAME IS NULL:2011/07/23(土) 22:40:33.66 ID:???
>>22
前スレ見てテーブル名を拝借したのですが、
結局何も解決されて無さそうで、質問しました。
質問者の人は納得したみたいですが、自分はよくわかりません・・。
25NAME IS NULL:2011/07/23(土) 22:52:37.20 ID:???
テーブルを三つに分けるなんてあほかというのが第一感だけど
セキュリティを考えるとありかなと思って
そうすると3か所でセキュリティを考えないといけなくなるから
とか考えて思考停止中。
26NAME IS NULL:2011/07/23(土) 23:51:24.02 ID:???
管理ユーザーと二つの会員は明らかに別の実体だろ
たまたま似たような属性があるからってまとめればいいってもんじゃないぞ
27NAME IS NULL:2011/07/24(日) 00:09:31.34 ID:???
別の実体かどうかなんて、あれだけの情報で判断できるわけないだろ
テーブルを分ける前提での質問だから、その是非は元の質問とは別の話だ

で、元の質問は、名前どうしよう、ってんだから、好きにしろとしか
28NAME IS NULL:2011/07/24(日) 00:15:36.19 ID:???
相変わらず、テーブル名やフィールド名だけの情報から
予断を持って語るやつの多いこと。
29NAME IS NULL:2011/07/24(日) 08:46:27.33 ID:???
web系での経験則ではだいたい分けてたな。
uiも腐るほど分けるのが普通だし。
人さらって何ぼだし。
3021:2011/07/24(日) 23:01:03.86 ID:???
>>27
それが結構重要だと思うんですよ。
名前が決まらない事には、DB設計できないと思うんです。

>>21の例で言うと、users以外にadminとbizがありますが、
「そもそもビジネス会員って何なの?その会員は他の会員とどう違うの?」
って他人がテーブルを見た時に理解できないと困ると思うんです。

で、>>25-29の間で
「同じ”ユーザ”なんだから1つのテーブルだろ」とか、
「構造自体が違うんだから分けるべきだろ」
とか意見が多々ある時点で、設計段階で"迷い”が生じてると思うんです。

その迷いがあると、後からテーブルを追加しようにも困ると思うんですよ。
各会員でそれぞれJOINするテーブルが増えてきた時とか。

もちろん、用途に寄って異なるというのは重々承知してるのですが、
会員の種類や分け方、正規化の考え方って、全く情報無いんですよね・・・
ようやく探したのが前スレのログぐらいで・・・
だからもう少し汎用性のある考え方がしたくて、質問しました。
3121:2011/07/24(日) 23:03:56.99 ID:???
自分としては、1つのテーブルでまとめるのに疑問を感じるんです。
「区分」や「権限」のカラムを追加して分ければいいと思いますが、
そうなると、1つのテーブルに色んな会員情報が入る事になり、
規模が大きくなると対応しにくいんじゃないか?って思うからです。

かといってその前を単純に「(種類名)_users」にするのも良いものか?
と思い、悩みに悩みが重なっている状態で、設計が進みません・・・
32NAME IS NULL:2011/07/24(日) 23:53:10.94 ID:???
そうなると、1つのテーブルに色んな会員情報が入る事になり、

基本情報と個別情報を分ける
33NAME IS NULL:2011/07/25(月) 00:20:48.34 ID:???
>>30
名前なんて定義に付ける記号なんだから、テーブルの物理名なんか最後においといてもDB設計はできる

>「そもそもビジネス会員って何なの?その会員は他の会員とどう違うの?」
まずお前がちゃんとこれを分析(定義)できてるのか?
もしできてるなら、それをここで発表すればこのスレの人がテーブル分けるべきかどうか議論してくれるだろう

>「同じ”ユーザ”なんだから1つのテーブルだろ」とか、
>「構造自体が違うんだから分けるべきだろ」
>とか意見が多々ある時点で、設計段階で"迷い”が生じてると思うんです。
迷ってなんかないぞ。それぞれが思う勝手な要件で言ってるだけで
その要件が違うから答えが違うだけだ
34NAME IS NULL:2011/07/25(月) 00:21:20.23 ID:???
>>28
じゃあどんな情報があれば判断できるの?具体的に挙げてみてよ
3521:2011/07/25(月) 00:33:04.57 ID:???
>>33
自分が一番悩むのは「後から追加する場合?」を想定するからなんです。
例えば、「プラン」というテーブルを追加したいとします。
一般会員なら、プランは無料・有料を分けるテーブルだと思いますし、
ビジネス会員なら、ベーシックコースとかゴールドコースとかになると思います。
(要はプラン=料金コースですかね)

その時、>>21の考え方で行くと、同じ「プラン」でも
用途やフィールド構造が全く違うので、結合するテーブル名は分けるわけですが、

users_plan → 一般会員のプラン
biz_users_plan → ビジネス会員のプラン

となって、テーブル名が冗長化していかないか?と思うからです。

テーブル名がこうなると、実行するアプリ側のファイル名や変数名も
biz_users_plan_register.php(ビジネス会員プランに登録)とか
$biz_users_plan_name(ビジネス会員プラン名)とか
名前がどんどん長くなっていく恐れがあります。
そうすると、スパゲティーコードになる元です。

そういうDB設計+アプリ設計まで想定すると、
最初のDB設計を上手くやらないと、後々困る事になるので、悩むわけです。

要件というのは、DBを使用するサイトやアプリの規模が大きくなる事で
変わってくると思うし、大きくなって対応できない設計では困ると思うんです。
3621:2011/07/25(月) 00:36:17.28 ID:???
すみません。>>35に書いた「冗長化」は違いました・・・。
単に「名前が長くなるとわかりづらくならないか?」と言った
問題定義をしたかったのですが、言葉の選択を間違えました。。、
37NAME IS NULL:2011/07/25(月) 01:37:21.54 ID:???
アプリまで考えるってんならカラム名そのままProperty化想定がそもそも・・・
biz_users_plan_name as planNameとか書けないDBもないだろうし、
O/Rでマッピング弄るとかも余裕で可能

アプリまで考えるにはアプリを知らないと出来ないよ
スパゲッティも意味合い違うし
3821:2011/07/25(月) 01:51:49.30 ID:???
自分はアプリ開発も5年ほどあるので、そこそこ知ってるつもりです。
あと、自分の場合、カラム名が長くなったり、テーブル構造が増える事で
スパゲティーコード化(他人には分かりづらいごちゃ付いたコード)
する傾向にあるので、そのように書きました。

>>21の例ではビジネス会員としていますが、
「何を持ってビジネスとするのか?」と言うのもあると思います。
単純に有料会員の事なのか、お店のオーナーなのか、
広告出稿などの広告主なのか、BtoBのクライアントの事なのか。

これだけ考えても「ビジネス会員」という名称にはかなり幅広くあります。
ですので、単純にbiz_usersとしても汎用性が利かずに
何に対する会員(ユーザ)かわからなくなってくると思うんです。

ここまで説明すると、私がテーブル名の付け方・考え方について
悩む理由も分かっていただけると思うのですが・・・不足があればご指摘下さい
39NAME IS NULL:2011/07/25(月) 02:12:50.52 ID:???
>>35
だからまず、一般会員とビジネス会員とはなんだという問題があってだな
これが別物なら、それぞれの操作に対して別の名前付けるのは当然だろうが

名前が長くて困ることがあるのか?お前が使うホストアプリはDBの項目名がそのまま変数名じゃないとだめなのか?

名前が長いから問題になるなんてことはない
名前が長いってなら、順に連番で振れよ

途中で要件が変わったのなら当然DB設計も変更するか検討する必要があるが
規模が大きくなって対応できないってのは、事前の要件定義が甘いだけだ
40NAME IS NULL:2011/07/25(月) 02:25:35.08 ID:???
>>38
>「何を持ってビジネスとするのか?」と言うのもあると思います。
>単純に有料会員の事なのか、お店のオーナーなのか、
>広告出稿などの広告主なのか、BtoBのクライアントの事なのか。

つまり、DBに格納すべきデータに対する要件定義もできてないのに
テーブル作って名前も決めろと?

今の段階での要件が、たとえば
・とりあえず何らかの会員管理を行う
・会員にはいくつかの種別がある(種別の詳細は不明)
ぐらいしか決まってないのに、その段階でテーブル分けるとかなんで決めてるかね
じゃあ将来会員種別が増えたらテーブル増やすのか?普通そういうことはやらんが

テーブル名に悩む前に、テーブル作るかどうか、それに何を格納するか考えた方がいいんじゃね
41NAME IS NULL:2011/07/25(月) 02:51:11.59 ID:???
テーブル名の前に会員テーブルを分割する意味が判らないんだけど
一般とかビジネスって会員を形容する、従属する属性じゃないのかな
それとも一般会員とビジネス会員はそれぞれまったく異なった名詞なのかな
4221:2011/07/25(月) 02:54:34.74 ID:???
>>38-39
>じゃあ将来会員種別が増えたらテーブル増やすのか?普通そういうことはやらんが

自分はまさにそれをやろうとして、「本当にこれで良いのか?」
で悩んでおり、設計できない状態なんです。
だから名前すら決められないんです・・。

それに、会員種別毎にテーブルを”分けない”
という理由に納得行かないんです。

理由は「バックアップしづらい」と「セキュリティ的に不安」だからです。
1つのユーザテーブルにまとめて、カラムで種別を分けるのが
一般的だと思いますが、どう考えても上記2つが引っかかるのです。

それに、会員テーブルなら共通項は、ログインID・パスワード・Emailぐらいです。
それなら種別毎に指定するテーブル(プロフィールとか会社情報とか)
と一緒にして、「○○会員テーブル」というのを作った方が管理しやすいのではないか?
っと思い、そうしようとしたら>>35みたいな悩みが出てくるわけです。

>>39さんが書いてるように、規模が大きくなって対応できないのは
要件定義が悪いと思うので、開発前に定義を詰めたいのですが、
”会員”という定義一つとってもここまで悩むわけです。
(ちなみに、悩むのはあくまで”複数会員”を想定した場合です)

自分はマニュアル思考なため、出来るだけ他者と同じような設計をしたいので、
こうやって自分が納得できる答えを見つけたいと思い、
皆さんのアドバイスをいただいている次第です。

4321:2011/07/25(月) 03:00:43.73 ID:???
もう少し具体的に書きますと

■会員テーブル(users)
id、loginid、email、password、type

として、typeの種類によって各会員を抽出すると思います。
MySQLでビジネス会員を取得するなら、
SELECT * FROM users WHERE type='biz'

みたいにするのが一般的だと思います。
しかし、繰り返しますがこれをすると、

・テーブルのバックアップが取りづらい
・セキュリティ的に不安(全会員の情報が漏れる可能性がある)
・会員数が増えた場合の使い勝手

こう言うのが気になるため、「テーブルを分けよう」と思った次第です。
そして、分けるとなれば、名前について引っかかり、
アドバイスを求めて、あーでもない・こーでもないと悩んでおります・・。
44NAME IS NULL:2011/07/25(月) 06:54:19.41 ID:???
いまいち>>21の立ち位置がビジネスの方も企画する立場なのか、データベースの担当なのか、アプリのプログラマもやるのか分からんが、
・悩む原因は要件定義が甘いから、つまり聞きとりが不十分だから
・名前は問題になるところじゃない

ER図を2パターン作ってメリデメでどちらかにもう決めたらいいんじゃないか
45NAME IS NULL:2011/07/25(月) 08:14:17.20 ID:???
>>43
バックアップ取りづらいってのは理解できんな
普通DBのバックアップは、そのDBを一括でバックアップする
そうしないとテーブル間の整合性がとれなくなるから
そのDBにいくつテーブルがあってもあんまり関係ないんだが?

仮にテーブル単位でバックアップするとしても
その場合テーブル数が多い方がバックアップする手間が増えるのは明白だとおもうが?

あと会員数は百でも千でも万でも、使い方は同じだが?
理論上一つのテーブルを、物理的にいくつかに分割して格納することも無いではないが
お前のレベルでは無縁の世界の話だ

結局お前のテーブル分割要因に賛同する点がいくらかでもあるとすれば
セキュリティ的要因でテーブル分割するって言うだけだが
それすらまずお前の要件定義のレベルでは話になってない

他者と同じ設計にしたいって言ってるのに、なぜ一般的と自分で言ってる方法でやらない?
自分で一般的な方法にケチつけといて同じような方法で設計したいって何言ってんだか
46NAME IS NULL:2011/07/25(月) 08:52:51.85 ID:???
若輩者だし何行ってるのかよくわかんねーけど

同じ項目があるならそれは同じテーブルに
区分毎に別項目があるならそれは別テーブルにすればいいんじゃないの?

セキュリティ云々はDB構成よりそれ以外のUIやら管理体制に問題あるんじゃ?
47NAME IS NULL:2011/07/25(月) 13:29:31.16 ID:???
ユーザーテーブルが減ったり増えたりするとして、
例えば全ユーザーのアクセス履歴が欲しい時にどんな設計にするつもりなんだろ
俺ならそんなデータベースに関わりたくない
4821:2011/07/25(月) 15:07:57.34 ID:???
>>44
全てです。自サイトの今後の発展を考え、リニューアルを検討しているのですが、
どういう仕様にすれば後々安心で、他人が見てもわかるか?
と言うのを重視しており、おっしゃるとおり要件定義が甘いので
皆さまのご指導をいただいております。

>>45
DB一括でバックアップするもんですか?
私はこれまで必要なテーブルのみバックアップしていました。

あと会員数は万単位で、サイトは1000万PV/月なんで、
現状のレベルでは無縁な範囲だと思います。
ですが、今後の発展を考えた時、
どう考えても私一人では運営できませんし、
仕様が自分本位では人に依頼してもトラブルの元です。
ですので、他者と同じ設計にしたいと思いました。

一般的な方法にケチをつけているわけではなく、
私自身がその設計について納得出来ないと設計できません。
ですので、論理的に
「これこれこういう理由があって、こういう設計にするし、
あんたが考えるリスクを避ける事が出来る」

という説明をいただけると私も納得できると思うのですが、
現状では「テーブルを分ければいいじゃん」という結果だけで
その主旨をご説明いただいていないので、混乱している状況です。。
4921:2011/07/25(月) 15:12:42.26 ID:???
>>47
今は、「ユーザ」は、サイトを利用する会員と、管理ユーザしかいないので、
アクセスログは一般会員のみ取得しています。

今の私の考えで行くと、
「ビジネス会員のアクセス履歴」を取ろうとする設計なら、

user_logs → 一般会員のアクセス履歴が入るテーブル
biz_user_logs → ビジネス会員のアクセス履歴が入るテーブル

にしていると思います。

会員種別が違いますので、
「全アクセス履歴が欲しい」という要件にはなりづらいです。
50NAME IS NULL:2011/07/25(月) 15:18:29.41 ID:???
>「テーブルを分ければいいじゃん」
そんなこと言ってるのはお前だけだ
5121:2011/07/25(月) 15:42:43.78 ID:???
申し訳ありません。書き間違いでした。
正しくは↓の通りです。

現状では「1つのテーブルで管理すればいい」という結果だけで
その主旨をご説明いただいていないので、混乱している状況です。。
52NAME IS NULL:2011/07/25(月) 16:27:08.54 ID:???
>>51
ビジネス会員や一般会員がユーザーの属性と考えてる人は分けない
あなたの懸念している点は設計の本質ではないの

> ・テーブルのバックアップが取りづらい
バックアップとソースが等価にならないものはバックアップと呼ばない

> ・セキュリティ的に不安(全会員の情報が漏れる可能性がある)
実装の問題であって設計の問題ではない
テーブルを分けた場合の利点とやらも↓で代用できる程度のもの
CREATE VIEW biz_users AS SELECT * FROM users WHERE ビジネス会員のみ;

> ・会員数が増えた場合の使い勝手
DBMSのお仕事ですがな
53NAME IS NULL:2011/07/25(月) 16:39:40.07 ID:???
管理ユーザーと会員ユーザーを
同様にユーザーの属性と考えてるやつの論理が理解できないわけだが、
そこの説明はないのか?
5452:2011/07/25(月) 17:42:32.92 ID:???
>>53
誰へのレス?
管理ユーザーと会員ユーザーについてなんて論点にしたものは見当たらないんだが
属性と考えてないのなら勝手に分けりゃいいじゃない
55NAME IS NULL:2011/07/25(月) 17:50:42.68 ID:???
全てですって全てでスキルが足りてない
素直に上司に出来ませんって言っておけでFA
ここはDB設計で要件整理代理スレじゃねーしw
5621:2011/07/25(月) 18:05:24.93 ID:???
>>55
上司じゃなくて、自分が運営しているサイトの話しです。
「ユーザ」という考え方のテーブル設計・名称を考察しておりますので、
スレ違いでないと思うのですが・・・・

>>52
その回答に対しては理解できました。
でも、私には「1つのテーブルに複数会員の情報が入る」
と言う設計について、どうしても納得行かないんです。

それがどのように便利でどう当たり前の設計なのか、
その点については誰も回答されていませんよね?
「当然だ」と言うからには、何かしら理由があってそうしてると思うんです。

それが分かれば私が悩んでいた「名前の付け方」についても
答えが導き出せると思いますし、納得して設計出来るようになると思うのですが・・・
5752:2011/07/25(月) 19:12:29.82 ID:???
>>56
以下のケースで user.role ではなくテーブルで区分けされている時にどう実装するのか考えてみたら
利点が見えてくるんじゃないかなー

CREATE TABLE user (id INT, name TEXT, role TEXT);
INSERT INTO user VALUES (1, 'ちんこ君', '一般会員');
INSERT INTO user VALUES (2, 'まんこさん', 'ビジネス会員');

-- 会員なら誰でも投稿できるブログ
CREATE TABLE blog (editor INT, content TEXT);
INSERT INTO blog VALUES (1, 'chinko');
INSERT INTO blog VALUES (2, 'manko');

-- 投稿者名一覧が欲しい!
SELECT editor.name FROM blog LEFT JOIN user AS editor ON blog.editor = editor.id;
58NAME IS NULL:2011/07/25(月) 19:48:20.67 ID:???
要件上、一般会員とビジネス会員を同じ会員として扱うならまとめたらいいし、
ビジネス会員と一般会員は全然扱いが別なら別テーブルにすればいいと思う

でも全然扱いが別ならそもそもデータベースを一般とビジネスで分けてそれぞれにuserテーブルでも作ったらいいんじゃないかな

みんな言ってるけど要件次第かと
5921:2011/07/25(月) 19:58:58.55 ID:???
>>57
実際にテーブルを作成して試しました。
このコードで引っかかるのが
「会員なら誰でも投稿できるブログ」という事って
あまりないのではないでしょうか?

同様に、「投稿者名一覧が欲しい」というケースも
”一般会員(ビジネス)としての一覧”が欲しいというケースはあっても、
会員種別無く出力するケースて、ほとんどないと思います。

「それならroleで会員指定すれば良いだけ」なのはわかりますが、
端から別物だという考えがある会員情報を、
どうして一つのテーブルにしているのか?が引っかかるのです。
6021:2011/07/25(月) 20:03:29.90 ID:???
>>58
他のシステムも色々と見たのですが、
一般会員の場合、ほぼ必ず「プロフィール」という情報があります。
そして、ビジネス系の会員の場合は「会社(契約者)情報」です。

1つのテーブルでまとめる場合、

// 一般会員を表示
SELECT * FROM users INNER JOIN profile ON users.id=profile.users_id
// ビジネス会員を表示
SELECT * FROM users INNER JOIN company ON users.id=company.users_id

として、常に別テーブルと結合しなくてはいけません。
それなら端から別のテーブルにして、
usersなら一般会員情報(アカウント+プロフィール込み)
bizi_usersならビジネス会員情報(アカウント+会社情報込み)
とする方が、編集・削除の面からも便利なのではないか?
と思い、「テーブルを分ける」という考え方でいます。

しかしながら、他の人の意見を聞くと「1つのするのが一般的」と言われます。
だから、私の中で考えが混乱してしまい、要件定義できずにいます。
61NAME IS NULL:2011/07/25(月) 20:33:19.64 ID:???
>>60
そこまで分けた方が良いと思うのならそれでいいでしょ
会員向けメルマガの配信ログを残したりログイン履歴を残したりと思ったときに
テーブルが会員の種類だけ増えていくことに抵抗なさそうだし
62NAME IS NULL:2011/07/25(月) 20:51:44.49 ID:???
自分がわかるように作れよ・・・
webprogにでも行けよしょーもない
63NAME IS NULL:2011/07/25(月) 20:57:24.86 ID:???
会員種別が増えるごとにテーブルが増えていくのか・・・
64NAME IS NULL:2011/07/25(月) 21:12:12.12 ID:???
>>60
ビューってしってるか?
あとお前がどれほどのシステム扱ってるかしらんが
結合せずにDBから単一テーブル持ってくる処理なんて実務にほとんどないぞ

>編集・削除の面からも便利なのではないか?
>と思い、「テーブルを分ける」という考え方でいます。
編集・削除といった処理はどうとでもなるから、そんなことではなく
要件(モデル)によってわけるかどうか決めろってみんな言ってるんだが

>他の人の意見を聞くと「1つのするのが一般的」と言われます
少なくともここの意見では、一般的って言えるほど優勢な意見ではないと思うが
みんな要件次第っていってるぞ
お前が別物だって言うならわければ良い。それだけ

>私の中で考えが混乱してしまい、要件定義できずにいます
まさかと思うが、お前、テーブルレイアウト決めてから要件定義しようとか思ってないか?
テーブル分けるかどうか決めてから要件定義するんじないぞ
要件によってわけるかどうか決めるんだぞ
6521:2011/07/25(月) 22:00:04.56 ID:???
>>61-64
はっきりいって、私の中で要件は「後々変わる」と思ってます。
現在、私が運営しているサイトでは、一般会員と管理ユーザで
問題なかったので、会員種別という概念が無く、単にテーブルを分けていました。

しかし、サイト(システム)をリニューアルさせる段階で、
会員の種別が増える事と、一般的(他人から見て)を考えた時、
たちまち、どうすればいいか?が分からなくなってきてるんです。

私が、phpMyAdminと言うツールでDBを管理しているのもまずいのかもしれません。
これを使ってアプリの動作テストをしていると、いちいちSQLを実行しないと
抽出できないので、使い勝手が悪く、だからテーブルを分けている
と言う要因もあると思います。

しかし、已然として
「会員種別が異なるテーブルに、全ての会員情報を保持しても良いのか?」
と言う疑問を感じてなりません。

せめて、「ここのサイトでは1つの会員テーブルで操作している」
と言う事例があれば、想像も付くと思うのですが・・・
66NAME IS NULL:2011/07/25(月) 22:01:11.50 ID:???
君のやるべきことは要件定義であって、DB設計じゃないよ。
67NAME IS NULL:2011/07/25(月) 22:04:09.67 ID:???
こんな5年経験者が居るのかと驚愕したが・・・
よくよく考えれば夏休みかw
68NAME IS NULL:2011/07/25(月) 22:04:35.18 ID:???
>phpMyAdminと言うツールでDBを管理しているのもまずいのかもしれません。

ツールの問題ではないことに1000テラベクレル
6921:2011/07/25(月) 22:05:32.91 ID:???
では、仮に要件定義として、
今までの「一般会員」と「管理ユーザ」に、「ビジネス会員」を追加する。
と決めたとします。

それでも、私が悩んでいるように、テーブルを分けるか否か、
分けた時のテーブル名をどうするか?
と言う悩みが解決されないのではないでしょうか。
7021:2011/07/25(月) 22:07:40.83 ID:???
>>67
そう言いますが、今まで私が書いてきたような悩みって全く持ちませんでしたか?
サイトの希望や必要とする要件が増えると、必然的に持つ悩みだと思うのですが・・・

>>68
すみません。その通りでした。phpMyAdminは関係ないですね。
71NAME IS NULL:2011/07/25(月) 22:07:42.36 ID:???
要件定義でやることも理解できてないと・・・。
72NAME IS NULL:2011/07/25(月) 22:08:57.81 ID:???
このレベルで悩んだことはないなぁ。
73NAME IS NULL:2011/07/25(月) 22:21:45.64 ID:???
>>21
良い事を教えてやろう。
1つのテーブルにまとめる理由は

テーブル数が増えないから

だ。これは非常に大きいぞw(いや、冗談抜きで
74NAME IS NULL:2011/07/25(月) 22:25:27.85 ID:???
>>70
君の力量では今悩むことは意味が無い
答えが出ないし、誰かに出してもらっても理解出来ない
君の力量では今思いついてる物を完成させる事が出来るかどうかという感じ
先はその時また悩めばいい
75NAME IS NULL:2011/07/25(月) 22:28:23.77 ID:???
そうそう。とりあえず作ってみれば良いんだよ。
他の人が1つのテーブルでまとめるって書いてるんだから。
素直にその設計でアプリなりサイトなり作ってみて、
それでも気に入らなければ、自分が思うとおりにすれば良いんだよ。

やる前に悩むのは馬鹿だ。机上の空論でしかない
76NAME IS NULL:2011/07/25(月) 22:28:57.89 ID:???
そうそう。分けたいなら分ければいいじゃん。
何が正解だったのかは、そのうち理解できるよ。たぶん。
77NAME IS NULL:2011/07/25(月) 22:49:51.21 ID:???
てか、今のテーブル構成に種類追加するだけで良いんじゃないか?
一般会員と管理ユーザと分けてるんだろ?一般会員に種類つければ。
これが一番近道であり、納得できるだろ。
78NAME IS NULL:2011/07/25(月) 23:33:07.61 ID:???
おまえら偉そうに言ってて、話してるうちに前提を忘れてるのな。
ほんとに要件定義とかできるのかよ。

> 最初は1つのusersテーブルに区分を付けてまとめようとしたのですが、
> 各会員のカラム構成が違うので、独立したテーブルにしようと思いました。
79NAME IS NULL:2011/07/25(月) 23:46:12.30 ID:???
>>78
Q. テーブルを分けるのはおかしくないですか?一般的なのを知りたいです

A. 分けないのが一般的

Q. まとめるとどうたらこうたらで納得できません!迷ってるんです!

A. 迷わず試せよ、試せば判るさ!バカヤロー! ←今ココ
80NAME IS NULL:2011/07/26(火) 09:31:38.33 ID:???
持つ属性が違う以上は別のテーブルを作る必要はあるだろうけど

1. user
userid,共通属性1,共通属性2...

2.nom_user
userid,属性1,属性2...

3.biz_user
userid,属性1,属性2...

こんな感じでuserテーブルでIDを一意にするようにしておいたほうがいい
userテーブルに会員区分を持つ

その構成ならテーブル分けるのと変わらないじゃんとか言われそうだけど

会員全体という括りで処理をすることが一生ない?
81NAME IS NULL:2011/07/26(火) 11:09:57.12 ID:???
横からすいません。質問です。

2つの条件を満たすユーザのみ指定のデータを閲覧できるようにしたいのですが
どのようにデータを持たせればいいか悩んでいます

わかりづらいですよね。

例えば1と2と3の顧客リストがあって(内容は同じですがリストに名前が付いている)それぞれに閲覧権限があるとします。

それだけならユーザテーブルに権限をいれておけばいいのですが、
今回はさらにユーザ毎に閲覧できる都道府県も限定したいのです。

単純に各都道府県用に閲覧できるかのフラグをユーザテーブルに持たせてもいいのですが
なんかすごい横長のユーザテーブルができてしまうような…

どうしたらスマートな感じになるでしょうか…?
82NAME IS NULL:2011/07/26(火) 14:04:23.40 ID:???
>>81
SQL質疑応答スレ向けな気がする

create table prefecture (prefecture_id int);
create table customer (customer_id int, prefecture_id int);
create table user (user_id int);
create table user_accessible_customer (user_id int, customer_id int);
create table user_accessible_prefecture (user_id int, prefecture_id int);

select * from customer as c where
  exists (select * from user_accessible_customer as ac where ac.user_id = 1)
  and exists (select * from user_accessible_prefecture as ap where ap.prefecture_id = c.prefecture_id and ap.user_id = 1)
83NAME IS NULL:2011/07/26(火) 15:18:14.25 ID:???
whereやorderで使うことのある
0か1のフラグ的なものや、0から9までとか短い範囲の数字しかないものにも
インデックスって効きますか?
つけないほうがいいでしょうか?
一応つけてみましたがレコードが少ないので効果はわかりませんでした
84NAME IS NULL:2011/07/26(火) 17:03:09.39 ID:???
>>83

MySQLでの例(どこでも変わらんとは思うけど
パーティショニングの使用例 - カーディナリティが低いカラムを使って検索する場合
http://nippondanji.blogspot.com/2009/04/1.html

、インデックスをつけたいカラムのカーディナリティが低い場合だ。カーディナリティとは日本語に訳すと濃度とか訳されるが、要は値の種類(分散具合)のことである。
例えば、YesかNoの2つの値しかとらないカラムは非常にカーディナリティが低く、インデックスをつけるととても効率が悪い。インデックスを使って目的の行を見付け
ようとしても、インデックススキャンが起きるだけなので、オプティマイザはしばしばそのようなスキャンを回避して、テーブルスキャンを選択してしまう。(その方が
インデックスと行の間の行き来がなくなるので、高速になるからだ。)ただし、どちらか一方の値を持つ行だけが圧倒的に少ないというような場合、少ない方の値を
指定すればオプティマイザはインデックスを使用する。例えばYesの行が10万行あって、Noの行が100行のとき、条件でNoを指定すればオプティマイザはインデッ
クスを利用するだろう。しかし、YesとNoの行が半々ぐらいの場合には、インデックスを利用することは殆ど無い。

85NAME IS NULL:2011/07/26(火) 18:13:47.03 ID:???
結構、ユーザデータってテーブル分けて管理してる奴多いんだな
やっぱ、用途毎に分ける方が管理しやすいからか?
86NAME IS NULL:2011/07/26(火) 18:55:12.77 ID:???
どうだろね。
同じ名前のカラムが並ぶようだと変だと思わんのかなあ
87NAME IS NULL:2011/07/26(火) 19:47:37.40 ID:???
単に正規化してるだけでは?
どんなデータか分からないけど
好きな食べ物みたいなのは分けるでしょ
88NAME IS NULL:2011/07/27(水) 00:39:54.06 ID:???
もう分けて union しとけよ
89NAME IS NULL:2011/07/27(水) 00:47:12.71 ID:???
いつまでやるんだよ・・・
90NAME IS NULL:2011/07/28(木) 00:47:32.08 ID:???
wordpressとかxoopsのユーザーテーブルでも参考にしたらどうだ?
91NAME IS NULL:2011/07/28(木) 07:21:09.49 ID:???
このスレの住人的には第1正規形にもしないんだろうか
92NAME IS NULL:2011/07/28(木) 09:33:04.52 ID:???
wordpressは1つのユーザテーブルだな。

SNSのプラグイン入れたけど、
その時はprofileテーブルと結合する形だった。

ただ、同じテーブルを使っているからか、
管理画面も同じだから少し違和感を受けたな。
93NAME IS NULL:2011/07/30(土) 19:02:53.80 ID:???
質問です。次の二つならどちらが自然な設計に感じますか?

1.
顧客(顧客コード)
顧客受注(顧客コード、受注コード)
受注(受注コード、受注総額)
受注明細(受注コード、受注明細コード、明細金額)

2.
顧客(顧客コード)
受注(顧客コード、受注コード、受注総額)
受注明細(受注コード、受注明細コード、明細金額)
94NAME IS NULL:2011/07/30(土) 19:04:15.73 ID:???
95NAME IS NULL:2011/07/30(土) 23:49:48.55 ID:???
一つの受注に顧客は一つしかないという暗黙の前提が含まれてるなら2
そうじゃないなら1

ここで何回も言われてるけど、テーブルの項目名だけで設計の是非なんて判断できんぞ
9693:2011/07/31(日) 00:04:43.25 ID:???
>>94>>95
回答ありがとうございました。
やはりカーディナリティが判断基準なんですね。
スッキリしました。
97NAME IS NULL:2011/07/31(日) 03:18:12.53 ID:???
多対多を表す対照表を、
ER図に書くのと書かないのとは
どちらが分かり易いと感じますか?
理由混みでご意見頂きたいです
98NAME IS NULL:2011/07/31(日) 13:27:05.66 ID:u5tg0kuA
文字列型でで保存するか、数値型で保存するか迷う
例えば、ショッピングサイトで、配送希望日時と、配送方法を選ばせる場合、
セレクトボックスで、
-午後 12 時 〜 午後 2 時
-午後 2 時 〜 午後 4 時
-午後 4 時 〜 午後 6 時
-午後 6 時 〜 午後 8 時
-午後 8 時 〜 午後 9 時
こういう選択肢があるとすると、
上から順に1,2,3,4,5として数値で保存(PHPの配列か別テーブルでマッピングさせる)するか、
上記の文字をそのまま文字列型で保存するか悩みます

僕の考えでは、将来上記の時間帯が変更になることも考えられるので、
そのまま文字列として注文と一緒に保存してしまおうと思ったのですが、、、どうすべきでしょうか?

その他、支払い方法として、
・代引き引き替え
・玄関先クレジット払い
というラジオボックスもあります。これはやはり数値でしょうか???
でもこれを数値でやるなら、前の例も数値でいいんじゃ??と混乱してきたので、
アドバイスを求めにやってきました。。。どうかお願いします。
99NAME IS NULL:2011/07/31(日) 13:39:17.84 ID:???
どっちでもいいよ。
100NAME IS NULL:2011/07/31(日) 13:40:51.94 ID:u5tg0kuA
そうおっしゃらずに。。。
101NAME IS NULL:2011/07/31(日) 14:05:06.25 ID:???
>将来上記の時間帯が変更になることも考えられる
データベース設計をころころ変えるなよ
それはもう互換性のない違うアプリケーション
102NAME IS NULL:2011/07/31(日) 14:21:17.12 ID:???
設計じゃなくてデータが変わるんだろw
103NAME IS NULL:2011/07/31(日) 14:24:04.74 ID:???
>>98
その文字列と数値が1:1対応するならば扱いやすい方にすればいい。
どっちも「時間帯」に対する記号でしかないんだから。
時間帯を開始時刻と終了時刻の組で表現するとかなら設計レベルで
違うと言えるけどね。
104NAME IS NULL:2011/07/31(日) 14:26:35.17 ID:???
>>98
マスタ作ってマスタのIDで管理するか、そのまま開始、終了の時間をもつか
どっちにしても文字型で保存するのはあり得ん

>>101
時間帯が変更されても対応できるような設計をしろってことで
設計を変えるわけじゃないと思うが
105NAME IS NULL:2011/07/31(日) 18:21:30.17 ID:???
あれ?結局、正規化の話になるんじゃないのか、これ?

文字列で保存→ 正規化でテーブル分ける テーブルで変更にも対応?
数字で保存→ アプリケーション アプリケーションで変更に対応
106NAME IS NULL:2011/07/31(日) 18:27:23.99 ID:???
一定の表示以外にも使いまわすなら素のデータでもたしといて
利用する側で加工だろうな。Webでしか使わない、という場合でも
携帯端末向けとかで表記変えることはあるし
107NAME IS NULL:2011/07/31(日) 18:57:36.72 ID:???
>>105
>>98はそういう話に発展させる含みを持っているのかもしれないが、
書かれている内容だけじゃあわからんな。データ型の話だけなら>>99でFA。
108NAME IS NULL:2011/07/31(日) 20:32:52.54 ID:???
PHPで〜とかでてるしこの前のユーザの人でしょ
ならどっちでもいい
109NAME IS NULL:2011/07/31(日) 22:39:45.91 ID:???
文体が違うから別の人でしょ。

てか、正規化の話題多いけど、それだけ難しいとも言える。
DB設計で一番大事な部分だと俺は思うけどな。
110NAME IS NULL:2011/07/31(日) 23:23:22.81 ID:???
え〜?このスレでまともに正規化が議論されることなんて珍しいぞw
111NAME IS NULL:2011/08/01(月) 00:24:17.48 ID:???
”まともな”と定義すれば無いかもしれないけど、
少なくとも正規化に関する質問が多いのは事実だよな
112NAME IS NULL:2011/08/01(月) 09:09:01.47 ID:???
>>98をdb関連の話にすると、
配送日時を別テーブルで管理することにしたとする
配送日時の時間割をxデイ以降、新時間割に変更することになったが、xデイ以前の注文は旧時間割に従わなければならない
というケースが予期される場合、どんな設計にしたらよいですか?

こんな感じじゃないのか?

おれの解は、配送日時テーブルに、IDを今度は11から振って、新時間割を入力し、プログラムでxデイ以降の注文には11からの配送日時をインサートする、かな

携帯とかの場合は、別カラムをアルターしてプログラムで携帯用のカラムをセレクトする
113NAME IS NULL:2011/08/03(水) 00:40:01.92 ID:???
ところでお前らDB設計にマインドマップとか使ってる?
114NAME IS NULL:2011/08/04(木) 22:42:14.36 ID:???
マインドマップってかER図でおすすめのソフト教えてください
115NAME IS NULL:2011/08/05(金) 23:56:33.10 ID:???
うん、マインドマップでER図書いてるw
116NAME IS NULL:2011/08/06(土) 00:01:17.75 ID:???
>>112
EFFECTIVE_START_DATEとEFFECTIVE_END_DATEが必要だな
117NAME IS NULL:2011/08/06(土) 10:39:26.39 ID:???
>>115
やっぱりDDLとかER図から自動で書いてほしいなあ
118NAME IS NULL:2011/08/09(火) 00:20:01.44 ID:???
>>117
逆に今ER図書けるのでDDL出力ないのって何?
119NAME IS NULL:2011/08/09(火) 01:33:19.96 ID:???
マインドマップを出力してほしいって事だろ
120NAME IS NULL:2011/08/09(火) 02:29:45.71 ID:???
>>119
よほどマインドマップが嫌いみたいだな
121NAME IS NULL:2011/08/11(木) 18:55:32.11 ID:???
削除フラグのはなし
http://www.slideshare.net/syachi/ss-8808413
122NAME IS NULL:2011/08/17(水) 23:04:36.76 ID:???
参照元の複合キーをサロゲートキーにする場合、
参照先で複合キー&外部キーにしていた自然キーは削除するものですか?


サロゲートキー追加前(BがAを参照)
A(a,b,c)(主:a,b)
B(a,b,d,e)(主:a,b,d 外部:a,b)

サロゲートキー追加後
-削除する場合
A(s,a,b,c)(主:s ユニーク:a,b)
B(s,d,e)(主:s,d 外部:s)

-削除しない場合
A(s,a,b,c)(主:s ユニーク:a,b)
B(s,a,b,d,e)(主:s,d 外部:s ユニーク:a,b)


削除する場合、Bテーブルを条件更新する時、
AとBをJOINした後に条件指定しないといけません。
(そういうもの?なら、Bを参照するCが出た場合、AとBとCをJOINしてCを取得?)

削除しない場合、サロゲートキーにするメリットが無い気がします。
(JOINはサロゲートキーで、条件は自然キーにできる?)
123NAME IS NULL:2011/08/17(水) 23:54:32.76 ID:???
この場合は削除するのが普通だね。
デメリットについてもその通りなんで得失を踏まえて選択すべし。
どうしても削除しない方にしたい場合は、sと(a,b)両方の外部キーを
設定しておくという手もテクニックとしてなくはない。
サロゲートキーにするメリット?をどう考えているのかはわからんけど。
124NAME IS NULL:2011/08/19(金) 00:41:02.17 ID:???
ってかサロゲートキーと、ナチュラルキーと、それ以外
って感じでエンティティが3区画に分かれるモデリングツールってある?
俺の場合はナチュラルキーをAK1(col2,col3)とかにするんだけど、
そういうのがダイアグラム上で認識できるやつキボンヌ。

つまりサロゲートキーにすると本来の主キーがわからなくなるのをなんとかしたい。
125NAME IS NULL:2011/08/19(金) 21:39:08.94 ID:???
メモリ設計を易しく教えて下さい
126NAME IS NULL:2011/08/20(土) 02:11:11.85 ID:???
たくさん用意しろ
127NAME IS NULL:2011/08/21(日) 19:59:31.21 ID:???
質問でう。

TableAとTableBが1:Nのときに
TableBにこれといって一意になりそうなキーがないとき
TableBには連番とか振るべきですか?
128NAME IS NULL:2011/08/21(日) 20:15:09.35 ID:???
キーがないとして、なにをもって1:Nと判断したの?
129NAME IS NULL:2011/08/21(日) 21:47:15.00 ID:???
>>127
それはTableBの行を一意に特定できないってことなんだが、それで良いのか?
130NAME IS NULL:2011/08/21(日) 23:13:57.29 ID:???
一対一と言ってる訳でもなし困ってもなさそうだし良いんでしょうね
131>>127:2011/08/21(日) 23:28:22.94 ID:???
>>128
1つの住所に対してどんな人が住んでいるか
なので1:Nかな。と

>>129
TableBは一意に特定することはないので問題ないと思われます


一意に取りに行くことはないので連番などは振る必要はないのでしょうか?
132NAME IS NULL:2011/08/22(月) 11:42:41.29 ID:???
1件削除するのも困りそうだが、、、まあそういうケースが無いならいいんじゃない?
133NAME IS NULL:2011/08/22(月) 12:45:42.13 ID:???
TableBをごっそり削除&新たに挿入するケースでは要らないな
134NAME IS NULL:2011/08/22(月) 23:31:37.15 ID:???
親のキーと同じNon-Unique Indexぐらいはればいいじゃない。

もっとも連番なりハッシュ値なりでPKにするのがいちばんいいと思うがね。
135NAME IS NULL:2011/08/22(月) 23:34:58.10 ID:???
ハッシュはユニークが保証されないのにPKにするとか本気かと
136NAME IS NULL:2011/08/23(火) 00:38:38.09 ID:???
非ユニークになるようなことが殆どないようにすればいいだけ
137NAME IS NULL:2011/08/23(火) 01:00:10.15 ID:???
訂正。
TableBは一意に特定することはない
と言い切っているので
親のPKに連番だのハッシュだのくっつけて複合索引にする必要もないわな。
NonUniqueIndexだけでOK

138NAME IS NULL:2011/08/24(水) 10:56:03.76 ID:???
>>136
ほとんどって...それでキー重複のエラーでシステム停止したらどうするんだ?
そんなのあらかじめ予見できるエラーだぞ

なぜハッシュを計算する元の値をキーにしないで、かぶる可能性が高まるハッシュ値をとってキーにするって発想になるのか理解できん
139NAME IS NULL:2011/08/24(水) 13:44:44.81 ID:???
従属するテーブルには一意キーがないと言ってるんだそ。
そもそも元の値をキーにしたらどっちにしてもかぶるだろが。
元の値がなにを想定してるのかわからんが
ハッシュ値のシードとして(何かの列値+ランダム値もしくはsystimestampが必要なんだよ

ハッシュの意味がないのでどうでもいいことだが
従属先テーブルの主キー+求めたハッシュで複合索引にするならば
分散度を考慮すればキーが被ることはほとんどありえない。
140NAME IS NULL:2011/08/24(水) 13:52:41.02 ID:???
横からだが、普通に連番にすればいいだけの話

連番>>>>>>>越えられない壁>>>>>>>ハッシュ値

> もっとも連番なりハッシュ値なりでPKにするのがいちばんいいと思うがね。

こんな、さもハッシュが連番と同等の提案であるかのように書くからおかしな話になる
141NAME IS NULL:2011/08/24(水) 16:17:24.27 ID:???
::::::::        ┌─────────────── ┐
::::::::        | またハッシュがやられたようだな…│
:::::   ┌───└───────────v───┬┘
:::::   |フフフ…奴は人工キー四天王の中でも最弱 …│
┌──└────────v─┬────────┘
| 一意制約ごときに負けるとは│
| 主キーの面汚しよ       │
└────v────────┘
  |ミ,  /  `ヽ /!    ,.──、
  |彡/二Oニニ|ノ    /三三三!,       |!
  `,' \、、_,|/-ャ    ト `=j r=レ     /ミ !彡      ●
T 爪| / / ̄|/´__,ャ  |`三三‐/     |`=、|,='|    _(_
/人 ヽ ミ='/|`:::::::/イ__ ト`ー く__,-,  、 _!_ /   ( ゚ω゚ )
/  `ー─'" |_,.イ、 | |/、   Y  /| | | j / ミ`┴'彡\ '    `
  自動採番    完全ハッシュ関数   連番     >>127
142NAME IS NULL:2011/08/30(火) 00:18:55.71 ID:???
DB設計の一般的解法やトレンドが見られるような本とかサイトってないでしょうか。
例えば会計システムや生産管理システムはこういう風に作るもの、とか
ソーシャルアプリならこんな感じでテーブル分割する、とか。

今日あるところで、
生産管理システムでの製品と部品の関係
(部品が集まると製品となるが、その製品もさらに大きな製品から見ると部品)
を表すテーブル設計のサンプルを見かけましたが、そんな感じで。

オープンソースのWebアプリのテーブル定義などは少し見ているんですが
いろんな分野のが見てみたいです。
出来れば簡単でいいので見所の解説入りで。
143NAME IS NULL:2011/08/30(火) 00:21:25.92 ID:???
聞いたことも見たこともないな。
144NAME IS NULL:2011/08/30(火) 00:47:34.33 ID:???
うーん、ないですかね。

まとまってるサイトなどがなかったら、個々のシステムごとの
「うちはこの問題をこう解決した」
的な話でもいいです。

例えば自分が知ってるのだと、リンクは出来ませんが2006年に発表されてた
mixiのDB分散アーキテクチャ、レベル1・レベル2の話は
テーブル分割が必要なほどの大量データをいかに配置するか、
というのの参考にとても良いと思いました。
145NAME IS NULL:2011/08/30(火) 00:54:43.05 ID:???
KVSとRDBMSは、まったく違うもんだと思ってる。
146NAME IS NULL:2011/08/30(火) 15:30:17.69 ID:???
>>144
生産管理のはあるけど
ソーシャルのはないと思うね
147NAME IS NULL:2011/08/30(火) 20:51:48.13 ID:???
>>145
もし144へのレスでmixiの件だったら、
当時のレベル1、レベル2ってのはKVSじゃないです。
関係なかったらすみません。

>>146
ぜひ生産管理の教えてください。
148NAME IS NULL:2011/08/31(水) 00:03:25.50 ID:EB4rX3D7
>>147
ISBN4-534-03473-3とか
149NAME IS NULL:2011/08/31(水) 05:47:24.12 ID:???
設計屋の飯のタネだから、みんな出したがらないんじゃないか
150NAME IS NULL:2011/08/31(水) 20:58:09.25 ID:???
>>148
おお、まさにこんな本があったんですね。ありがとうございます、見てみます。

>>149
ノウハウが案件特有の条件に関係しすぎて
守秘義務で出せないってこともあるかもですね。
でも知りたい。
151NAME IS NULL:2011/09/03(土) 11:29:02.59 ID:???
検索用にタグ機能を作りたいんですけど
どんなテーブル構造にするのが一般的ですか?

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

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

タグの上限は未定です

152NAME IS NULL:2011/09/03(土) 11:31:07.06 ID:???
上限未設定なら自ずと答えは見えてるじゃん
15393:2011/09/04(日) 01:22:16.60 ID:???
>>142
> 今日あるところで、
> 生産管理システムでの製品と部品の関係

自分は情報出さないが
情報はくれってか?
154NAME IS NULL:2011/09/04(日) 01:23:57.97 ID:???
>>148
速攻でアマゾン発注した
有益な情報ありがとう
155NAME IS NULL:2011/09/06(火) 10:23:27.40 ID:???
9999-01-01と9999-12-31のどっちが好きですか?
156NAME IS NULL:2011/09/06(火) 13:56:22.84 ID:???
9999-99-99 ははねられるな、、9999-09-09 うーん、9月9日に
バグ出したとこあったよなw
157NAME IS NULL:2011/09/06(火) 13:57:11.76 ID:???
たしか99-09-09だったかなー1999年の話だな
158NAME IS NULL:2011/09/08(木) 12:18:39.29 ID:???
>>155
でもnullさんの方がもっと好きです。
159NAME IS NULL:2011/09/08(木) 18:16:39.19 ID:???
昨今は終了日とかってNULLの流れ?
160NAME IS NULL:2011/09/08(木) 20:39:31.57 ID:???
自分は9999-12-31だな。
「終了してるかどうか」を見るのに、
WHERE end_date >= now() OR end_date IS NULL
とか無駄すぎる。
161NAME IS NULL:2011/09/09(金) 01:56:51.14 ID:???
普通終了日だと、終了した日(か終了予定日)が入るもんじゃないか?
「終了してるかどうか」なら、
end_date <= now()だと終了、それ以外なら終了していない、って判定で良いんじゃないかね
162NAME IS NULL:2011/09/09(金) 06:49:25.17 ID:???
>>161
終了予定日が決まってないデータをどうするか、って話の流れだと思うんだが。

それをNULLにしてると、
終了しているものを取得するなら end_date < now() でいいけど
終了日が条件になるのは、終了してないものを取得して表示したい、って時だろうから
end_date >= now() OR end_date IS NULL
になっちゃう。

163NAME IS NULL:2011/09/10(土) 03:07:57.50 ID:???
なっちゃっても別に問題はないけどな。
164NAME IS NULL:2011/09/10(土) 07:19:45.64 ID:???
条件が増えるとそれだけパフォーマンスが落ちると思うが。
しかもOR条件やNULLってインデックスが効かないんじゃなかったか。
165NAME IS NULL:2011/09/10(土) 11:43:46.63 ID:???
インデクスにNULLを含められるDBMSならインデックス一応効くだろ
166NAME IS NULL:2011/09/10(土) 22:07:54.00 ID:???
たとえば9999-12-31が終了してるという意味ですよ、とするなら
終了日が必要な場合、別途項目が必要になる
それなら素直に終了日もってれば良いんじゃないかと

まあ9999-12-31入ってる項目がなんの項目何だよって話はあるが
終了してるかどうかにNULL判断したくないってなら別途フラグ項目持てば良いんじゃね
167NAME IS NULL:2011/09/11(日) 07:13:44.83 ID:???
>>166
> たとえば9999-12-31が終了してるという意味ですよ、とするなら
誰もそんなことはしないと思うが……。
168167:2011/09/11(日) 07:21:39.48 ID:???
すまん、途中で送ってしまった。続き

>>166
商品の販売終了日とかで、
終了日が決まってないレコードは何を入れる?
169NAME IS NULL:2011/09/11(日) 08:09:56.53 ID:???
だから、NULLでいいんじゃね?
170187:2011/09/11(日) 09:40:06.34 ID:???
どうしてもnull入れたり、or条件の検索行いたくなければ、元のマスタには開始日だけもち、終了日は取扱い終了マスタのようなので別管理。
検索は、inやexistsを使う感じになるんじゃないの?
171NAME IS NULL:2011/09/11(日) 22:07:47.86 ID:???
ああ、NULLにしてるってことなのか。
今のところ終了期限日に9999-12-31で問題がある理由が見つからないので
170みたいな定義にはしないけど、
NULLが主流だという話は理解した。ありがと。
17293:2011/09/11(日) 22:11:08.26 ID:???
9999/12/31って直感的じゃないよね
なんとなくセンス悪そう
173NAME IS NULL:2011/09/11(日) 22:22:37.09 ID:???
インデックスにNULLを含められるかどうかにかかわらず
NULLにするほうがDB屋としてセンスないけどな
174NAME IS NULL:2011/09/11(日) 22:40:21.97 ID:???
どんなセンスだwwシックスセンスか?
175NAME IS NULL:2011/09/11(日) 23:28:03.27 ID:???
between使う状況を考えてみろ
176NAME IS NULL:2011/09/11(日) 23:36:19.38 ID:???
nullを最小値とみなすか最大値とみなすかはDBMS依存だな
177NAME IS NULL:2011/09/11(日) 23:43:18.82 ID:???
外部結合以外でNULLが出てくるのは三値理論の理解を根本的に間違えてる。
178NAME IS NULL:2011/09/12(月) 01:58:26.21 ID:???
NULLをまともに取り扱えないプログラマは、項目にNULL入れる設計嫌うよね
179NAME IS NULL:2011/09/12(月) 03:15:05.66 ID:???
アホか。そういう問題じゃない
180NAME IS NULL:2011/09/12(月) 06:32:53.74 ID:???
uniqueじゃなきゃ困るだろ
181NAME IS NULL:2011/09/12(月) 06:43:17.31 ID:???
>>177
非キー属性がキーに完全従属するならば、属性ごとに分解したテーブルを
外部結合するのと等価なんだがな。
182NAME IS NULL:2011/09/12(月) 08:29:39.05 ID:???
お前らな〜、null間違った使い方してるとDB神(ゴット)が泣くぞ
183NAME IS NULL:2011/09/12(月) 08:58:25.67 ID:???
神託(,Oracle)ですか?
184NAME IS NULL:2011/09/12(月) 09:59:22.66 ID:???
CHARで0000/00/00と9999/99/99にせよとお告げがあった
185NAME IS NULL:2011/09/12(月) 11:31:33.03 ID:???
文字列の扱いで不用意にnullが混入する下地を作ってしまったオラクルは神を冒涜する邪教だと思う。
186NAME IS NULL:2011/09/12(月) 16:41:44.01 ID:???
オラクルって未だにnullと空文字列を区別できないの?
187NAME IS NULL:2011/09/13(火) 13:15:54.73 ID:???
そこを変えるとえらいことになるからなw
18893:2011/09/14(水) 02:40:00.83 ID:???
>>180
終了日付がuniqueである必要って何よ?
189NAME IS NULL:2011/09/21(水) 17:39:51.41 ID:???
皆さんはコードの持ち方ってどうしてますか?

区分カラム作って1つのテーブル?
コード毎に1つのテーブル?
190NAME IS NULL:2011/09/21(水) 18:41:26.17 ID:???
いくらなんでも質問が端折り過ぎだろ…
191187:2011/09/21(水) 21:47:38.69 ID:???
>>189
例えば、性別(男、女)や続柄(兄、弟、父)をコード化して管理する時、一つのテーブルに性別列と続柄列を作るか、別々のテーブルにするかってこと?

頑張ってエスパーしてみたが、前者のような設計なんて考えられないので、もっと別のことが聞きたいんだろうな。
192187:2011/09/21(水) 21:53:02.16 ID:???
>>189
もしくは、コード列と名前列をもつテーブルにすべてのコード体系を詰め込みたいのだろうか?

パラメータを管理するために、年度や税率を一つのテーブルに詰め込んだりはするが、コードの管理ではやらないな。
193NAME IS NULL:2011/09/21(水) 22:02:36.59 ID:???
key-value モデルだとありうるな
194NAME IS NULL:2011/09/22(木) 00:48:40.43 ID:???
例えば、携帯キャリアごとのプランマスタ、というテーブルなら
ドコモプランマスタ、auプランマスタ、というふうに
3キャリアそれぞれに個別のマスタを持ってもいいけど、

|プランID|キャリアID|プラン名|価格|補足情報…|

みたいな構造はありえるかも。
この場合、キャリアIDカラムが、>>189の言う区分カラムになるかな。
同じ意味で括れる情報なら、まとめておいたほうが便利なこともあるので。
システムからみて全く意味の異なるものはまとめないと思う。
195NAME IS NULL:2011/09/22(木) 01:02:00.89 ID:???
>>189
まずコードと区分とは何かをはっきり定義してくれ

>>191
いや、たぶん
区分,コード,名称
1,1,男
1,2,女
2,1,兄
2,2,弟
2,3,父
なテーブルを想定してると思うんだが
196NAME IS NULL:2011/09/22(木) 01:25:36.08 ID:???
RDB設計のセオリーからは外れるけれども
汎用的な設計にするなら十分ありだよ。
197NAME IS NULL:2011/09/22(木) 01:45:15.61 ID:???
実質的に
外部キー制約かけられないだろ
ないな
198NAME IS NULL:2011/09/22(木) 01:50:19.23 ID:???
tes
199>>189:2011/09/22(木) 02:02:14.02 ID:???
わお書き込めた。
すいません。書き込んでないと思ってました。。

区分カラム作って1つのテーブルというのは
>>195 さんの感じであってます。

コードの数だけテーブルがあるのでどのコードがどのテーブルなのかとか
管理が大変とか思ったことありませんか?
オブジェクトブラウザなんかでテーブル一覧から必要なテーブル探すのにも
テーブルの数が多いと探すのがめんどくさくて・・・。

それで ID と 名称 だけでいいような単純なコードはひとつのテーブルに
まとめちゃえばいいのでは?と思ったのです。

でもそうすると結合するのがめんどくさかったり遅くなったり
>>197 さんの言うように制約かけれなかったりと問題もでてくるので
どうしようかなーと。

コードだけスキーマ変えるとか・・どうだろ。。
200NAME IS NULL:2011/09/22(木) 02:02:50.78 ID:???
>>197
ERPの設計見たことある?
201197:2011/09/22(木) 02:24:54.92 ID:???
見たことないんだが、
そのレスは>>195形式のコード値テーブルで
外部キー制約かけれるってことかい?
202NAME IS NULL:2011/09/22(木) 02:27:41.58 ID:???
無理。
203NAME IS NULL:2011/09/22(木) 03:27:17.83 ID:???
リポジトリのようなものならアリなんだろうが

区分付けて一つのテーブルに全部のコードいれたら、今度はその区分の管理に苦労するだけだな
204NAME IS NULL:2011/09/22(木) 11:03:11.72 ID:???
再帰結合用の外部キーの値ってルートはNULLにするのが普通?
今までは自身のレコードのキー入れてたんだけど
205NAME IS NULL:2011/09/22(木) 15:35:13.92 ID:???
NULLにしたほうが見た目判りやすいとおも
206NAME IS NULL:2011/09/22(木) 15:44:46.15 ID:???
DBMSにもよるけど
Oracleだとルートを探すときにインデックスが効かないな
LEVELカラム作って0とか入れればいいんじゃないかな
207NAME IS NULL:2011/09/22(木) 15:55:42.61 ID:???
ツリー構造の親を示すべきカラムに自分自身を指定するのはセンスがおかしい
208NAME IS NULL:2011/09/22(木) 16:05:58.57 ID:???
参照制約かつ非NULL思考だと自身になると思う
209NAME IS NULL:2011/09/22(木) 16:25:00.28 ID:???
>>208
NULLは不定を表すのだから親が居ない事を表すために使うのは妥当でない、
と気にする人なら「親を持っているか?」というカラムを追加したらいい
誰が親かは分からないままだが、親の有無だけははっきりする
NULLを入れたら死んでしまうようなNULLアレルギー患者には悪いがつける薬は無い
210NAME IS NULL:2011/09/22(木) 16:44:55.42 ID:???
>>207
RDBの場合に限れば話は別
211204:2011/09/22(木) 17:18:22.25 ID:???
キーをDB自動採番の場合めんどくさいことになったんで疑問に思ったんですが
パフォーマンスとか関係ないケースなんでNULLで良さげですかね
意見ありがとうございました
212NAME IS NULL:2011/09/22(木) 19:37:25.36 ID:???
NULLが不定なのではなく、NULLとの比較が不定なのだと思うのだが
213NAME IS NULL:2011/09/22(木) 22:18:35.36 ID:???
>>195は、複合PKだからやめたほうがいいと思う。
214NAME IS NULL:2011/09/26(月) 15:08:42.44 ID:???
uint利用なら何も考えずNOT NULLにして、
NULLの代わりに-1突っ込んでるがダサいのか?
215NAME IS NULL:2011/09/26(月) 16:48:33.73 ID:???
uintって符号なしってことか?
符号なしで定義しといてマイナス突っ込む神経は理解できん
DBMS何かしらんが、そもそもそんな操作は結果保証されないんじゃないか
216NAME IS NULL:2011/09/26(月) 17:22:08.27 ID:???
いやすまん、PG側はマイナス使わない前提で-1を無効値扱いってこと
217NAME IS NULL:2011/09/26(月) 21:57:00.40 ID:???
営業日の計算ってどうやるの?
218NAME IS NULL:2011/09/26(月) 22:02:28.35 ID:???
カレンダーをテーブルで持つと楽。
年次処理で来年度分を作る必要があるけど。
219NAME IS NULL:2011/09/26(月) 22:55:38.42 ID:???
>>216
なんつーか、先祖返りだなw
データの定義域には含まれないがそれを格納するデータ型の定義域には含まれる
ある値で無効値を表すという手法は、データ型によって扱いがまちまちになるし、
そもそもデータの定義域=データ型の定義域である場合は使えないから、汎用的に
使えるNULLというものが導入されたのに。
220NAME IS NULL:2011/09/26(月) 23:03:42.90 ID:???
電話番号を1カラムに市外局番から加入者番号までいれるべきか
それぞれ別カラムに市外局番・市内局番・加入者番号を作るべきか
221NAME IS NULL:2011/09/26(月) 23:52:24.61 ID:???
一カラムに決まってるだろ?
システム的に分けるメリットがない。
222NAME IS NULL:2011/09/27(火) 03:07:03.09 ID:???
数値にはNULL入れないな
文字列もオラクル以外ならNOT NULLだ
223NAME IS NULL:2011/09/27(火) 04:09:38.96 ID:???
その電話番号で何をするかだな
だが1カラムにするとカッコやハイフンどうするんだって話になるから
素直に全部わけといたほうがいいんじゃね
224NAME IS NULL:2011/09/27(火) 08:16:50.02 ID:???
カッコとかハイフン位置ぐらい自動で判別しろよ
225NAME IS NULL:2011/09/27(火) 19:33:59.79 ID:???
>>220
全部1カラムでもつと、市内局番が桁数変わったりするときに面倒な気がする
特定市外局番だけ、とか、特定市内局番だけ何かしたいって要件がないなら1カラムで良いんじゃない

>>224
市外局番と市内局番を分離するのは、市外局番のマスタ持たないと無理だったはず
226217:2011/09/28(水) 00:22:09.32 ID:???
ありがとうございます

カレンダーを作って翌営業日を出すところまでできました
翌々営業日は翌営業日の処理を繰り返すとできるのですが
他にうまい方法ってあります?
227NAME IS NULL:2011/09/28(水) 14:17:57.93 ID:???
>>226
カレンダーの日付を昇順で数えて1個目が最初の営業日、2個目が翌営業日でしょ
その通りクエリを書くだけじゃないかい
228NAME IS NULL:2011/09/28(水) 16:04:04.89 ID:???
カレンダーにあらかじめ営業日の連番を打っておけば簡単。
229NAME IS NULL:2011/10/15(土) 23:15:52.96 ID:???
前スレでJOINすると遅くなるというのは初心者発想って話題になってたけど未だにその意味が分からん・・
230NAME IS NULL:2011/10/15(土) 23:35:27.68 ID:???
そいつは非正規化の意味がわかってないんだろうな。
231NAME IS NOT NULL:2011/10/15(土) 23:44:46.97 ID:???
そいつがSQLを書くのが遅くなるという。
232NAME IS NULL:2011/10/16(日) 11:48:35.84 ID:???
複雑になれば考える時間が多くなるって程度のことなんじゃ?
233NAME IS NULL:2011/10/16(日) 15:35:47.45 ID:???
ああwhereだけで書くと可読性下がるって事か
234NAME IS NULL:2011/10/16(日) 20:47:05.95 ID:???
はあ?
235NAME IS NULL:2011/10/19(水) 15:34:36.46 ID:???
おれもどこかで「正規化しすぎるとJOINでパフォーマンス落ちるからあまりやらないほうがいい」
なんて文を見てだまされていたけど、ばりばり正規化してJOINしまくったほうが
パフォーマンスも汎用性も拡張性も良かったという。
236NAME IS NULL:2011/10/19(水) 20:24:44.49 ID:???
JOINした3テーブル以上の巨大な各テーブルに抽出条件が分散してしまう様なケース、つまりどのテーブルから見ても単独ではデータが絞り込めないような場合、パフォーマンスは悪化しがち。
残念ながらそう言う時に、パフォーマンス出すためには非正規化が必要。
237NAME IS NULL:2011/10/19(水) 23:20:32.44 ID:???
今ならインデックス付きのビューが使えたりして、必ずしもその必要はないかもしれん
238NAME IS NULL:2011/10/19(水) 23:26:03.88 ID:???
データモデルを非正規化するんじゃなくて
あくまでもクラスタ化されたビューを作るイメージだな。
そこを勘違いしちゃいかんな。
239NAME IS NULL:2011/10/20(木) 01:51:29.12 ID:???
クラスタ化前提ならDB設計関係ないやん
240NAME IS NULL:2011/10/20(木) 14:59:51.21 ID:???
正規化が面倒だから、適当に作ってパフォーマンスのために崩したと
言い訳するケースのなんと多いことか。
241NAME IS NULL:2011/10/29(土) 03:44:00.08 ID:???
頻繁に並び替えを行うので、
ソート用の項目を作りました。
数字が小さいほど優先度を高くする方式では大変なため、
cssのz-indexの要領で大きい数字の優先度を高くしたのですが、
並び替えでdesc処理をしなくてはいけないため、
遅くなるので困っています。
うまい解決方法はないでしょうか?
242NAME IS NULL:2011/10/29(土) 06:57:04.99 ID:???
とりあえずその項目にインデックス付けるしかないんじゃね
DBMSによってはインデックスに降順指定できたりするかも
DBMSによってはデータ配置をその項目順に指定できたりするかも(逆順で指定できるかはしらんが)

降順だと遅いって、ちゃんと昇順と比較した結果か?
243NAME IS NULL:2011/10/29(土) 07:52:26.17 ID:mhxhY6HH
>>241
どのDBMSなのかぐらい書くべし。
244NAME IS NULL:2011/10/29(土) 20:01:25.92 ID:???
INSERT後にINSERTしたものをUPDATEするトリガーがあります
INSERT時にはDEFAULT値を入れてるカラムで
このトリガーを使用することで初めてユニークな値になります
このカラムにたいしてUNIQUEキーを指定するのは問題ありますか?
内部でどんな処理が行われてるのかよくわからないのですが

ロック
INSERT
TRIGGER
アンロック

ならよさそうですが

INSERT
INSERT←別の人がINSERTしたがDEFAULT値で入るのでUNIQUEでないと怒られる

だと問題がありそうです

トリガーを使わないでINSERT前にSELECTしてもいけるのですが

トランザクション
SELECT
INSERT
コミット

ユニークキーを指定する場合無難に後者にするべきでしょうか?
それとも前者で問題ないでしょうか?
245NAME IS NOT NULL:2011/10/29(土) 23:47:31.68 ID:???
どんなトリガーなんだ?
246NAME IS NULL:2011/10/30(日) 03:32:29.68 ID:???
INSERT後にUPDATEしてそのユニークカラムの最大値+1を入れてます
自前オートインクリメントみたいなものです
247NAME IS NULL:2011/10/30(日) 04:09:28.27 ID:???
>>244
君も何のDBMSかぐらい書きなさいよ

俺はINSERT文自体にサブクエリ書いてるよ
248244:2011/10/30(日) 04:33:50.81 ID:???
>>244
ありがとうございます
DBは複数を想定しています
PgSQL MySQL SQLiteあたりのフリーのものです

重要な処理はDB側に持たせると安心なのでトリガーにしましたが
INSERT中にサブクエリ書いたことないので書式がわかりませんが
ちょっとやってみたいと思います
249NAME IS NULL:2011/10/30(日) 16:38:14.92 ID:???
制約がどのタイミングでチェックされるかは、SET CONSTRAINTS で制御可能なはず
実際にやったことはないし、DBMSによって実装されてるのかどうかもしらん
250NAME IS NULL:2011/10/31(月) 12:38:53.50 ID:???
http://wikiwiki.jp/hon/?Andromeda
このデータをうまく正規化しようかと思ってるんですが

カテゴリ分けしてみてください

ヒーロー名,ステータス、カテゴリ(メージ、ファイター)

ちょっとやってみてください


テーブルをここに出して見てください
251NAME IS NULL:2011/10/31(月) 12:50:39.79 ID:???
こういう変更の少ないデータはテキスト保存のほうが早い気がする
252250:2011/10/31(月) 12:51:20.95 ID:???
いいから早く出して見てください

テーブルを
253NAME IS NULL:2011/10/31(月) 13:53:44.59 ID:???
ここはDB初心者スレじゃねえからなあ....

まずは自分で設計してみて、それに対して指導/批評を住人に求む、
という形で再カキコしてみてわいかが? >>250
254250:2011/10/31(月) 14:04:10.25 ID:???
253の場合はどうやって設計しますか

スキルレベル1、2、3、4あります

しかもスキルは4つとは限りません
可変長です

どうしますか
教えてください
255250:2011/10/31(月) 14:55:15.65 ID:???
+---------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| stid | int(11) | NO | PRI | NULL | |
| str | float | YES | | NULL | |
| agi | float | YES | | NULL | |
| int | float | YES | | NULL | |
| hp | float | YES | | NULL | |
| mana | float | YES | | NULL | |
| armor | float | YES | | NULL | |
| marmor | float | YES | | NULL | |
| range | float | YES | | NULL | |
| as | float | YES | | NULL | |
| ms | float | YES | | NULL | |
| dmg | char(30) | YES | | NULL | |
| type | char(30) | YES | | NULL | |
| istr | float | YES | | NULL | |
| iagi | float | YES | | NULL | |
| iint | float | YES | | NULL | |
| ihp | float | YES | | NULL | |
| imp | float | YES | | NULL | |
| iarmor | float | YES | | NULL | |
| imarmor | float | YES | | NULL | |
+---------+----------+------+-----+---------+-------+
256NAME IS NULL:2011/10/31(月) 17:37:19.81 ID:???
正規化じゃなくてテーブル作ってください、レベルじゃないかw
257NAME IS NULL:2011/10/31(月) 20:30:02.45 ID:???
宿題スレじゃないから。以後スルーで。
258NAME IS NULL:2011/10/31(月) 21:40:29.79 ID:???
>>252
すげーなおい
259NAME IS NULL:2011/10/31(月) 21:52:36.99 ID:???
>>252
わろた
260NAME IS NULL:2011/11/01(火) 01:54:16.90 ID:???
>>252
異次元からの来訪者だなw
261NAME IS NULL:2011/11/01(火) 19:29:16.45 ID:???
下手に答えるよりも>>252を弄るのが面白そうだw
262NAME IS NULL:2011/11/06(日) 10:48:33.38 ID:0iaACRLf
はじめて利用させてもらいます。

MYSQLを利用して、Web販売システムを運用しています。

何を思ったのかクライアントがASPサービスとして現在のシステムを
使いたいと案を出されたのですが、こういった場合
会社ごとに扱う商品のテーブルを作成していく物なのでしょうか。

例、campanyA_product_table campanyB_product_table .....

基盤となる商品については、メインテーブルがありまして
こちらからASPを利用されるお客様が選択していく形となってます。
263NAME IS NULL:2011/11/06(日) 12:56:06.88 ID:???
>>262
顧客と商品の関連を後付けするだけでよくない?
select * from 商品 join 顧客が選んだ商品 using (商品ID) where 顧客ID = 'hoge'
264NAME IS NULL:2011/11/06(日) 12:59:03.95 ID:???
ASPなら別DBだな。
265NAME IS NULL:2011/11/06(日) 18:16:20.59 ID:???
普通会社ごとに別DBにするだろjk
266NAME IS NULL:2011/11/06(日) 18:23:13.59 ID:???
本当にそうだろうか?
ユーザー視点だと、物が買えればいんだから、
販売元がどこの会社だから、とか必ずしも興味がないよね。
むしろ、一度に調べられた方が都合がいい。

そーいった要望に応えるたまには、
会社ごとのDBを別々に検索してくるん?
267NAME IS NULL:2011/11/06(日) 18:40:51.53 ID:???
要は要件しだい。

要件ちゃんと書いてない >>262 にまともな答えは出ないと思う。
268NAME IS NULL:2011/11/07(月) 00:20:14.41 ID:fTuhKwsU
すみません。
MacBookAirを鞄に入れて移動中にコーラを買ったのですが
ノンカロリーのブラックが出てきました。

まあ、仕方ないと一口飲んで鞄にしまいました。
気づいたときには、わたしのAirが...

運が良かったことに、ノンカロリーのため
糖分でべと付かなかったことですかね

動くんですが、調子が悪くて落ち込んでいました。
明日、改めて要件を書きたいと思います。

269NAME IS NULL:2011/11/07(月) 00:23:14.31 ID:fTuhKwsU
ちなみに今、わたしの机の上にあるAirは
動いていません。 

270NAME IS NULL:2011/11/07(月) 00:27:23.98 ID:???
チラシの裏にでも書いてろハゲ
271NAME IS NULL:2011/11/07(月) 08:17:41.21 ID:???
>>266
それってASP?
272NAME IS NULL:2011/11/07(月) 17:47:24.30 ID:???
>>266
この場合の会社ってのは、ASPサービスを利用する利用者の事だと判断したんだが
273NAME IS NULL:2011/11/08(火) 01:26:00.02 ID:???
ところでお前らチューニングとかしてる?
今のDBはSQLレベルでチェックするだけで十分だよな?
274NAME IS NULL:2011/11/08(火) 10:07:28.66 ID:???
半年に1回くらいインデックスの再構築はする
275NAME IS NULL:2011/11/09(水) 02:39:57.99 ID:???
>>273
ある程度規模が大きくなるとチューニングは不可避
276NAME IS NULL:2011/11/09(水) 17:12:31.51 ID:???
チューニングって、設計段階での考慮じゃなくて、本番開始してからの見直しってことだよな?
>>274 なんかはチューニングってより保守作業って感じなんだが
実際問題チューニングってどんな作業がある?
設計当初のあまさや見込みが外れてそれに対する修正とか?
277NAME IS NULL:2011/11/09(水) 18:17:26.39 ID:???
インフラ側だけでも、パラメータやファイルの配置をいじってみたり、とかいろいろやることあるじゃん。
278NAME IS NULL:2011/11/10(木) 16:34:51.33 ID:???
>>276
設計段階で考える必要があるもの→ソーシャル、DWH
正規化してあれば運用後でもなんとかなるもの→バックオフィス
279NAME IS NULL:2011/11/13(日) 00:53:53.04 ID:???
設計と言ってもこのレベルの話ではないかもしれませんが、
ここ以外にお話をうかがえそうなスレが見当たらなかったので失礼します。

生産管理システムを構築中です。部品の管理単位は設計図上の番号でやっています。
塗装や研磨については設計図上の番号とは無関係になってしまうので、

加工マスタ (部品ID, 加工コード(0:完成部品、最大:組み立て・未加工品), 加工名, ・・・)

在庫データ (部品ID, 加工コード, 棚卸日, 棚卸時点在庫数, ・・・)

入出庫データ ( 部品ID, 加工コード, 受払日, 入出庫種別, 数量, ・・・) ’入庫、出庫、不良など。

というような形で作成しようとしています。
まずは、この方向性は正しいでしょうか?もっと優れたモデルがあるのでしょうか?

次に、工程見直しで加工が追加あるいは省略された場合の流れとして、
追加の場合、
・ 追加を指定された加工コード(含む)より大きいものの加工コードを+1する
・ 新しいレコードを追加する
削除の場合
・ 指定された加工コードより1大きな加工コードを持つレコードに在庫数などを合算する
・ 指定された加工コードのレコードを削除
・ 指定された加工コードより大きいものの加工コードを-1する
という感じで考えています。

この方向性は正しいでしょうか?もっと優れた処理があるでしょうか?
教えてもらえるとすごく助かります。
280NAME IS NULL:2011/11/13(日) 00:57:57.02 ID:???
加工コード、ってのが微妙な感じだな。それって加工状態を示してるんだろうから、
俺なら加工状態マスタを作ると思う。
281NAME IS NULL:2011/11/13(日) 00:58:07.86 ID:???
それもう既にマスタじゃないっしょ
282NAME IS NULL:2011/11/13(日) 00:59:54.91 ID:???
>>281>>279宛てね。
283279:2011/11/13(日) 01:01:32.47 ID:???
すみません。加工以外の部分は、

部品マスタ (部品ID, 部品名,・・・)

構成マスタ (親部品ID, 子部品ID)

の様に構成してあります。

その部分はすでに動いているシステムを移植中です。
加工関連部分が今回追加になり、Access VBAで動いているものを可能な範囲でDBMSの関数で書き直して
Accessへの依存度を下げて将来的にはPHPなどでブラウザからも使えるようにしたいです。
284NAME IS NULL:2011/11/13(日) 01:04:50.59 ID:???
>>279で言ってる「加工マスタ」は、
「部品ごとにどんな加工状態があるか」を示すテーブルじゃないの?
285NAME IS NULL:2011/11/13(日) 01:05:45.79 ID:b+TGUhtw
>>280
加工状態マスタとはどんなものでしょう?
部品ごとに加工内容、加工時間などが変わってくるので、加工マスタに集約しようとしています。
やりたい事は
・ 「今の部品在庫で期日までにいくつ作れるか」のシミュレート
・ 在庫の管理
・ 部品の手配の支援
等ですので、


>>281
どういう意味でしょう?よくわかりません。
286NAME IS NULL:2011/11/13(日) 01:07:37.12 ID:???
280、281、284 の説明でわからないなら、あきらめた方がいいよ。
287279:2011/11/13(日) 01:08:33.77 ID:b+TGUhtw
285=279です。失礼しました。

>>284
そうです。
「部品ごとにどんな加工状態があるか」マスタです。
288NAME IS NULL:2011/11/13(日) 01:14:23.61 ID:???
ようは、↓みたいのは止めとけって話だろ

・ 追加を指定された加工コード(含む)より大きいものの加工コードを+1する
・ 新しいレコードを追加する
・ 指定された加工コードより1大きな加工コードを持つレコードに在庫数などを合算する
・ 指定された加工コードのレコードを削除
・ 指定された加工コードより大きいものの加工コードを-1する
289NAME IS NULL:2011/11/13(日) 01:14:50.56 ID:???
>>285
まず感覚的に
工程見直しが主要な関心事として業務フローにあるなら
マスターってよりトランザクションに感じる

あとマスターならコードを滅多やたら弄るもんじゃないっしょ
それを参照するトランザクション系テーブル達が困るから
サロゲートキー使ってるわけでもなさそうだしね
290279:2011/11/13(日) 01:19:10.46 ID:???
つまり、リナンバーするような行為はヤメトケという事ですね。

加工マスタ(部品ID,加工状態ID,加工順位(0:完成部品,最大:組んだだけの状態),・・・)

のようにして、在庫や入出庫は 部品IDと加工状態IDをキーにした方が良いという事?
291NAME IS NULL:2011/11/13(日) 03:17:04.32 ID:???
全体的に要件がまったく解らんので何とも言えんが

部品を加工するってどういう意味合いだ?
部品(完成品)の製造工程として加工という工程が増えるのか?
部品(材料品、完成品)を加工することによって新たな部品(完成品)が発生するのか?
もしそうなら、加工前の部品(完成品)と加工後の部品(完成品)は同じ部品じゃない(=同じ部品IDを振ってはいけない)

それを踏まえたうえで在庫管理は何を管理したんだ?
>在庫データ (部品ID, 加工コード
>入出庫データ (部品ID, 加工コード
在庫、入出庫で部品IDと加工状況が必要になるなら、加工途中(=生産途中)の在庫状況が必要だってことか?
292279:2011/11/13(日) 03:56:16.73 ID:???
工場の生産管理・資材管理システムです。
製品部品展開での部品在庫数の管理システムが存在しています。
それに加工に関する部分が抜けているのでそれを追加しようとしています。
部品自体は設計図上の部品コードを元に管理しています。

例えばの話で、PCを組んでる工場だとして、
マザボにCPUとメモリ組みつけるのは部品の組み立てですよね。
設計図面にもそういう風に表現できると思います。
ヒートシンクにグリースを塗る様な作業は設計図面には注意書きにしかならないので、その辺が今まで実装されていませんでした。

※ 実際の現場ではバリ取りとか塗装とか注油とか焼き入れとかそういう作業を想定しています。

確かに部品自体が塗装などの状態が違えば違うものとしてモデリングするというのもわかりますが、
部品マスタに「部品番号1バリ取り前」「部品番号1塗装前」「部品番号1仕上がり品」みたいにするのは使う側にとって分かりにくいかなと思ってました。

部品を状態毎に1つの部品扱いにして組み立ての構成で子部品が1個の構成で加工を表現すればロジックを単純化できるのは分かってるんですが、
工場の人が構成を入力するので加工と組み立てを別にした方が良いかなと思っていました。

定石としてはやっぱり製品部品展開の中に加工自体を組み込んじゃう方が良いのでしょうか?
293NAME IS NULL:2011/11/13(日) 05:23:54.25 ID:???
つまり今まで製造工程については何も考えてなかったんだろ
部品(製造材料)ごとに加工工程があるって設計はやめた方がいいんじゃね
製品部品展開(構成マスタ)に加工工程組み込むのも俺はお勧めしないが
製品部品展開はあくまで材料を使うものしか入れないようにする
ちゃんと製造工程マスタみたいなのをつくり、そこに組み立て(材料消費あり)、加工(材料消費なし)とかちゃんと区別して入れる
そして製品(部品)製造工程データで生産品ごとの工程と必要な日数とか、使う部品とか作業場所とか使う機械とか入れる
294パッケージ屋:2011/11/13(日) 14:42:00.65 ID:???
一般的なパッケージだと・・・
加工の特徴はBOMを使わない,一連の加工の途中に中間在庫を持たない
のが違い.

そいう機能のないパッケージの場合はダミーBOMをかませる.
加工前,XX加工後,XXX加工後・・・・てな具合.でもマスタ設定めんどくて嫌がられるよ.

工程の定義だが,もっと細かい「設備」や「運転」の概念がある.
マシンが3台あっても旧型新型があり能力もリードタイムも作れるモノも違うとか.

バッチ運転なんてのは設備で括るからね.バリ取り,メッキ,熱処理なんか
一台のマシンでまとめてやることがある.運転条件として一緒に処理が
できるものとできないものがある.

さらに言えば冶具なんかの「減らないけど必要」で「排他使用」のものもある.
「ベテラン職人」なんてのもココで設定したりする.材料もマシンもOKだが
「その人」がいないと着手できなかったり加工できなかったり.

手間と漏れリスクを考えるとパッケージ買ったほうがいい.
295NAME IS NULL:2011/11/13(日) 15:00:46.94 ID:???
は? DB設計スレでパッケージ買えって・・・
296NAME IS NULL:2011/11/13(日) 15:53:04.30 ID:???
一昔前じゃ
パッケージ屋はパッケージだけは買うな
構築させられた奴はパッケージ買え
だったのにな、今の若いもんは能力に見合わない自信を持っておる
297NAME IS NULL:2011/11/13(日) 20:52:05.17 ID:???
>>296
ひと昔前の良さが全く伝わらないぞw
298279:2011/11/14(月) 02:08:51.32 ID:???
既存システムの移植・改修は決定事項なのでパッケに頼る事は出来ないです。orz
元々組み込み屋出身でDB屋ではないのでこんな簡単な事でも分からず恥ずかしい限りです。

さっそく見直しを掛けました。

構成マスタ (親構成ID, 子構成ID, 使用個数,・・・) キー 親構成ID, 子構成ID

構成マスタサブ(構成ID, 部品ID, 加工ID) キー 構成ID

加工マスタ(加工ID, 加工名, 加工時間・・・) キー 加工ID

部品マスタ(部品ID, 部品名, ・・・) キー 部品ID

在庫データ(構成ID, 棚卸日, 棚卸時点在庫数, ・・・)

入出庫データ(構成ID, 受払日, 入出庫種別, 数量, ・・・) ’入庫、出庫、不良など。

この方法ならリナンバー掛けるようなメンドクサイ事態は避けられそうです。
また、組立の時に加工マスタの1レコードにを子部品全部分の加工時間などをまとめられるので良さそうです。

既存の構成編集機能が弱いのでかなり強化しないとマズそうですが、
その辺は手続き言語で何とかしようと思います。

みなさんありがとうございました。
299NAME IS NULL:2011/11/15(火) 01:23:10.86 ID:???
>>298
「加工」は加工だけで組立工程は含まないの?
仕掛とか工程間の在庫とかは必要だし部品表とかけあわせた時に
「工程」のマスタがないとハマる。

構成と加工は独立かい?紐付けて構成・加工マスタにするのか?
(NCとか、複数工程に同じマシンの使いまわしがある事もある)

部品に版数とか複数メーカーとかつけておいたほうがいい。
ライン出庫には入らない、気にしてない場合も多いが発注するとき困るぞ。

入出庫にはfrom-toを入れるようにしといたほうがいい。
入りには「どこから」、出には「どこへ」
こうしておけば保留状態なんかも管理しやすくなる。
カッチリしたシステムにするならキーにするんだが、キーにせずとも
項目だけは入れておくと後々イイことがある。

あと在庫だが・・・在庫に限らず「場所」の定義がないとアカンだろ。
ラインの棚卸もするんなら倉庫だけじゃなく工程も定義すべきだ。

リナンバーについてだが、「もし変更が起きたら」を各現場でシミュレート
してみるといい。しかかってる現物をどうするか?の観点が大事。
300NAME IS NULL:2011/11/15(火) 19:58:50.28 ID:???
まあ、DB設計以前に要件定義の問題だな

ぶっちゃけ完璧な要件定義ができればDB設計なんて
組み合わせと並べ変えだけといってもいいんじゃね
301NAME IS NULL:2011/11/17(木) 22:08:07.85 ID:???
そこまで行けばデザインツールで自動生成だろ
302NAME IS NULL:2011/11/19(土) 14:34:35.73 ID:???
>>300
でもって大抵のビジネスアプリは画面からDB読んで書くだけ
303NAME IS NULL:2011/11/20(日) 09:57:41.09 ID:???
そもそもある程度以上の規模で、
完璧な要件定義なんてできたことあるか?
要件定義が完璧だと信じてガチガチのテーブル設計にして、仕様変更にうまく対応できないことの方が多くないか?
304NAME IS NULL:2011/11/20(日) 15:11:16.69 ID:???
>>303
仮にその時は完璧でも、そのうち要件が変化していくのが世の常。
だから、「ガチガチのテーブル設計」なんてするのは素人のやることだろ。
305NAME IS NULL:2011/11/20(日) 15:13:18.97 ID:???
要件定義が完璧かはともかく、仕様変更は要件の変更だろ
仕様変更があればテーブルも再設計・変更するのは必然

だが実際それに工数だしてくれないんだよなぁ
306NAME IS NULL:2011/11/20(日) 15:55:23.34 ID:???
>>304
もっともらしい意見にも見えるが、それってユーザー側の要件を設計側で勝手に拡げて
いるわけであって、そこで行っているのは「変化」の予測なんだよな。
だからその予測を外れる「変化」があったら役に立たないし、設計者の予測がユーザーより
正確であるとも限らない。
まぁ、同じようなシステムの構築経験が何度もあるとある程度パターンがわかるし、その
会社でのやり方しか知らないお客さんより大局的に見れたりというのはあるけれど。
ただしそれは、あらかじめ予測できるものであれば事前に要件に折り込むか判断しておく
べきであって、後からの要件の変更とは区別すべきものだとは思うが。
307NAME IS NULL:2011/11/20(日) 16:12:38.14 ID:???
現状でベストと思われる設計をすれば良いんじゃないのか?
308NAME IS NULL:2011/11/20(日) 16:31:23.98 ID:NgM7YNQ/
何がベストかが問題だ
309304:2011/11/20(日) 17:13:42.74 ID:???
>>305
> 仕様変更があればテーブルも再設計・変更するのは必然

そんなことはないだろ。できるだけテーブルに影響しないようにするのは常識だと思うが。
もちろん、すべてテーブル変更なしにできるなんていってるわけじゃないよ。

>>306
> あらかじめ予測できるものであれば事前に要件に折り込むか判断しておく

だからそうしろって言ってるんだが...。何が言いたいのかさっぱりわからん。

>>307
このプログラムは、どうせ 2000年まで持たないから年号は二桁でいいよね? (遠い目
310NAME IS NULL:2011/11/20(日) 17:17:43.11 ID:???
スレ違い。
311NAME IS NULL:2011/11/20(日) 19:47:37.15 ID:???
>>309
ん、違いがわからんか。
つまり、将来の変更への備えが必要だと気づいたなら、要件の方にfeedbackしておけということだ。
312305:2011/11/20(日) 20:11:20.83 ID:???
>>309
事前に予想できるなら、もちろんそれに対応できるようにテーブル設計するぞ
ただその場合は>>306の言うように要件として織り込んでおく
事前織り込み済みの変更なら仕様変更ではあるが要件変更ではないかもしれん

俺が言ってるのは事前織り込みの要件を超える仕様変更の場合だ
この場合最低限テーブルの見直し(とそれに伴う修正)は必要なんだが
最大の問題はここに工数がでないんだよ
それがためにガチガチの設計するやつは素人とかいう意見がでる
設計論としては間違ってるんだが、実際の商売としてはそうも言ってられん
313NAME IS NULL:2011/11/20(日) 21:28:48.97 ID:???
ソーシャルゲームとかでアイテムボックスのようなものを作りたいのだけど、

・ユーザーID1つにつきアイテムボックスは1つまで(変更の可能性なし)
・アイテムボックスに収納できるアイテム数上限は決まっている(変更の可能性あり)

↑こんな条件の時にはやはり
アイテムボックステーブル (ID、ユーザーID、アイテムID) 主:ID(一意性を保証するためだけのもの)

のようにして管理するのが普通なのかな?
アイテム上限数が固定で少数ならば
アイテムボックステーブル (ユーザーID、アイテムID1、アイテムID2、・・アイテムID10) 主:ユーザーID

という構成も考えられるけど
前者はアイテム使用とかで常にレコード数変化するし最大所持数チェックとかINSERT、DELETE、SELECTの回数もバカにならないだろうから何か心配な節がある
314NAME IS NULL:2011/11/20(日) 21:33:33.73 ID:???
好きにしろよ。正規化って意味では前者だけど、いろんな理由で後者が選ばれるケースもある。
315NAME IS NULL:2011/11/20(日) 22:09:25.88 ID:???
>>313
たとえばアイテムボックスに、アイテムスロット1,アイテムスロット2...とある場合だと
アイテムの格納されてる位置も必要なわけで、その場合なら後者も無くはない

が、おれなら間違いなく前者でもうちょい項目つける。格納位置(並び順)とか、数量とかはいるんじゃね
アイテムボックステーブルにIDはいらんだろうけど(ユーザID,格納位置でユニーク)

レコード数を変化させる必要も特にない。レコードの中身を消せばいいだけ(レコード消してもいいけど)
INSERT(つかむしろUPDATE)の負荷で考えれば、前者であればアイテム一つ分のデータを挿入するのに対し、
後者であればアイテム10個分のデータを挿入する。こっちのが負荷高い
selectの回数も同じだぞ。帰ってくる結果の行数は変わるかもしれんが
最大所持数チェックは前者だとcountなりsumなりで済むけど、
後者だとカラムごとに同じアイテムかチェックして足しこむ処理が必要だぞ
何を心配してるのかわからんな
316NAME IS NULL:2011/11/22(火) 10:17:53.70 ID:???
ここは論理設計だけか?物理設計とかも語ってよいのね
317NAME IS NULL:2011/11/25(金) 11:53:51.38 ID:???
twitterのつぶやき検索ってどーやってるんだろ
あれだけ大規模なツイートを検索とかFacebookよりすげぇ
318NAME IS NULL:2011/11/25(金) 13:06:46.81 ID:???
>>317
selectだろ
319名無しさん:2011/11/25(金) 19:51:43.71 ID:???
まあちゃんもヒットしなくても誰にも怒られないシステムだからな。
320NAME IS NULL:2011/11/26(土) 20:51:07.63 ID:???
DB経験3ヶ月の下っ端です。
正規化を勉強するにあたり、サーバ情報の管理を目的としたデータベースで以下の項目があった時、まずどうすれば良いでしょうか?
ぜひヒント貰えれば嬉しいです。

利用者500人/365day/24h
管理ホスト台数1500台

項目

ホスト名(not null)
IPアドレス1(not null)
IPアドレス2
IPアドレス3
OS(複数)
システム名(バラバラ)
アプリケーション名(バラバラ)
物理マシン設置国(4カ国)
データセンタ名(18DC)
サービス停止影響度(5段階)
物理/仮想(どちらか選択)
ハードウェア名(バラバラ)
利用ストレージ名(バラバラ)
アプリケーション責任者(バラバラ)
インフラ責任者(バラバラ)
可動開始日(date)
使用ステータス(二択)
ハードディスクc:(int)
321NAME IS NULL:2011/11/26(土) 21:18:25.69 ID:???
まずは本の一冊でも買って読むのがいいと思うぞ。
322NAME IS NULL:2011/11/26(土) 23:03:21.38 ID:???
>>320
>利用者500人/365day/24h
>管理ホスト台数1500台

なにを管理するのかよくわからんけど、Excel で十分じゃないかと思う。
323NAME IS NULL:2011/11/27(日) 00:50:28.36 ID:???
>>320
まずどうすれば良い・・・?
まずは考えるときに「管理」を自分に対して禁句にすることだ.

「サーバの情報の管理」と言えなくなれば,「サーバの情報」とやらを
使って「何がどうなった」時に「誰が何をどうする」のか真剣に考えるようになる.
これが管理の内容そのものだ.単に管理と言ってると思考がとまってしまう.

次に
「何がどうなった」と「誰が何をどうする」を記述できるようなデータはどういう単位に
なっていなくてはならないか,またそれらの単位の情報はいつどこから入手できる
のか,すべきなのかを考えねばならないことに気づく.

考えてるとスグに,データの粒度精度にも疑問が沸くはずだ.
「アプリケーション」の「責任者」すら単純に定義できないぞ.
カネの出し元,パッケージ提供元,システムとしての開発者,いまの運用担当部門,
受益者部門・・・のうち,どこが責任を持つべきなんだ?そもそも責任者ってナニするの?

こういう事を,ゲッソリするまで考え倒すことだ.そのためにもまず必要なのが,
繰り返しになるが「管理」って極力言わないようにすること.

「管理」だけじゃない.すぐにキーとかインデックスとか言わないのもコツだ.
上に書いたようなことを考える苦労の1%にもならんよ.
でもキーとかインデックスとかが楽なわけじゃない.それだけ考えることが多いってこと.

健闘を祈る.
324NAME IS NULL:2011/11/27(日) 01:13:14.66 ID:???
>>320
まずすべきことは現状分析
なにか改善したいのであれば要求分析
バラバラなものをどう管理すべきかということを考えざるを得なくなるはず。
とにかくヒアリングして分析しる
325NAME IS NULL:2011/11/27(日) 09:05:12.66 ID:???
>>323
プロフェッショナルなアドバイスありがとうございました。
そんな風に考えたことなかったのでとても勉強になりました!
326NAME IS NULL:2011/11/27(日) 09:54:46.54 ID:???
>>324
327NAME IS NULL:2011/11/27(日) 13:49:13.74 ID:???
>>323
管理、Managerここらを使わないようにするだけでだいぶ違うよな
328NAME IS NULL:2011/11/28(月) 15:00:19.70 ID:???
ああ、正規化の勉強したいのか。
エンティティ/リレーションシップについてちゃんとしたメソドロジーの書いてある本を読むべき。まずは基礎理論知らないと話しにならん。
難しいけど頑張って読破しろ。
329NAME IS NULL:2011/11/28(月) 15:02:47.01 ID:???
集合演算とかの概念も必要になってくるからそれもおさえとけ。
でないと正規化できない、というか方法論だけでもできるけど知っといたほうがいいだろう
330NAME IS NULL:2011/11/28(月) 19:32:15.04 ID:???
>>328->>329
理論といっても当たり前のことを言ってるだけだね.
いや,当たり前と思えるようになることが修行なのか.

正規化の説明を最初に読んだとき,第一正規化,第二正規化のあたりは
フムフム学問だなやっぱり,でもめんどくせえな〜などと思ってたが・・・

第三正規化の説明で
「まあ普通にやってれば第一,第二など意識せずに第三くらいまで正規化できるものです」
などと書いてあって一気にスッキリしたよ.
331NAME IS NULL:2011/11/28(月) 21:23:11.66 ID:???
>>328
ちゃんと基礎から勉強しろってのは賛成だが、正規化の前提はリレーショナル
モデルだからERはちょっと違うと思うぞ。
332NAME IS NULL:2011/11/30(水) 15:57:00.45 ID:???
いまどきはk-vだよな
333NAME IS NULL:2011/11/30(水) 18:32:58.86 ID:???
スレ違い
334NAME IS NULL:2011/11/30(水) 19:56:58.07 ID:???
最先端はカラム指向らしい
335NAME IS NULL:2011/11/30(水) 23:49:21.39 ID:???
>>334
kwsk
336NAME IS NULL:2011/12/01(木) 05:29:36.12 ID:???
337NAME IS NULL:2011/12/02(金) 01:52:23.37 ID:???
>>335
レコード(行)じゃなくてカラム(縦)ごとにデータをまとめておくこと.

ビッグデータとかmap & reduceとか最近目にするけど,これも流行なのかね.
CALSとかSOAとかWeb2.0とか,色々あったなあ.
338NAME IS NULL:2011/12/02(金) 04:28:45.71 ID:???
スキーマ型DBの欠点を克服できてるけど
何も考えずRDBの代わりに使ったらどえりゃーことになるぞ
気を付けな
339NAME IS NULL:2011/12/03(土) 18:33:27.23 ID:???
最先端って、どこがw
Sybase IQなんて相当古いじゃねーか。
特許が切れてオープンソース実装が出てきて流行ってるとか、そういうこと?
340NAME IS NULL:2011/12/03(土) 21:38:49.81 ID:???
これからはNoSQLが来るな
341NAME IS NULL:2011/12/03(土) 21:58:47.06 ID:???
>>340
用途による。課金システムがNoSQLだったらイヤだ。
342NAME IS NULL:2011/12/04(日) 00:32:15.40 ID:???
これからは放射能汚染がくるな
343NAME IS NULL:2011/12/04(日) 07:46:54.81 ID:???
とっくの昔にどっぷりヤラれてるような気がするんですけど
344NAME IS NULL:2011/12/05(月) 00:41:00.78 ID:???
>>339
最新なのは市場のほう.ビッグデータ云々というキーワードだ.
Map & ReduceやるぞのOracle,HPは列指向DBで・・・

発明じゃなくてバトルのあるところが「最新」「最先端」と呼ばれるのよ.
345NAME IS NULL:2011/12/05(月) 02:06:00.66 ID:???
欧州危機が最先端だな
346NAME IS NULL:2011/12/05(月) 04:16:44.47 ID:???
60年前ならとっくに戦争始まってるレベル
347NAME IS NULL:2011/12/05(月) 21:05:39.39 ID:0x+CibA0
皆さんに質問です。

今日会社でこんなことがありました。

私「テーブルの主キーに文字列は使わないほうがいいよ。そんなの見たことがないから」
後輩「どうしてダメなんですか?主キーが文字列のほうが見やすいじゃないですか。だめな理由をいってください!」
私「ぐぬぬ。。」

私はテーブルの主キーは絶対数値型だと思っていたのですが、文字列ではいけない理由をちゃんと説明できません。
実は私が勘違いしているだけで、テーブルの主キーを文字列にすることはよくあるんでしょうか?
文字列ではいけない場合、その理由を知っている方がいましたら、教えてください。
348NAME IS NULL:2011/12/05(月) 21:19:26.57 ID:???
パフォーマンスを優先するか仕様変更可能性を優先するかの違い
PKは文字列より数値のが速い
PKが社員IDのようなもので数値→文字列に変更可能性が考えられるなら数値のみでも文字列使ったりする
349NAME IS NULL:2011/12/05(月) 21:37:49.24 ID:???
商品コードとか普通に文字列使うが

ただ、その場合でも文字に意味をもたせないほうが無難だと思う
意味をもたせると将来桁数が足りなくなったりしやすい

じゃあ可変長にすればいいじゃない
というのは例えば帳票があると通用しない
350NAME IS NULL:2011/12/05(月) 21:39:03.68 ID:???
てか、わかってないことをなんで強弁するのw
まぁ、キーはサイズが小さい方がいいから、一般的に文字列より
数値の方が小さいので好まれるとか、可変長のキーは物理
配置が乱れることから好まれないとかあるけど、わかってない人は
「キーは絶対に数値型!」とか言いながらOracleでNUMBERを
使ったりするw
351NAME IS NULL:2011/12/05(月) 21:52:37.03 ID:???
オラクルは全てにおいてキャラが基本だよな?
352NAME IS NULL:2011/12/06(火) 01:24:31.02 ID:???
>>347
数字にこだわる理由はない.どっちかというとやめた方がいい.
もしそのこだわりがISAM以来の伝統だったりオブジェクト指向原理主義だったり
するのならなおさらだ.

まず,主キーが番号だと,とくに大きめのプロジェクトが破綻しやすい.
DB設計にヘタクソが入り,そのエンティティを何で識別すべきか?の議論をすっ飛ばして
も設計に入ってしまって,正規化しなくても機能そのものには破綻が出ないもんだから
そのまんま実装に入ってしまtって・・・

運用テストで「キーが違うけど他がまったく同一な2つのレコード,本当は同じモノだったよ」
みたいなクソ面倒くさい手直しが多発する・・・ような目にあいやすいよ.

それから主キーの数字にユーザーが意味づけしてしまう場合もあり,これまた面倒くさい.
3ケタ目4ケタ目が「20」から「46」までを抜き出してよ!とか言われるよ.
こういうのはプロジェクトもパフォーマンスも保守性も全部影響を受けるからね.
数値型での速度改善効果なんてすぐ吹っ飛ぶ.

あ〜イヤな事をいっぱい思い出した.
353NAME IS NULL:2011/12/06(火) 02:23:30.84 ID:???
>>352
体験談としては聞けるが、理論的な根拠まったくなしだな
単にお前がバカの設計したプロジェクトに入っただけだ。ご愁傷様

その項目が、0-9だけで構成されてて桁数に意味がないなら、数字にする方がいい
文字列だと1と01と001は別物なんだが、そういう要件はあまりない
354NAME IS NULL:2011/12/06(火) 07:25:11.40 ID:???
データ移行が多発するプロジェクトだと、意味のない数字キーだと、変換大変じゃない?
355187:2011/12/06(火) 08:29:17.43 ID:???
>>352
主キーをそのまま画面に出したのが運の尽きってとこだな。
別途、ユーザーから見える表示用のキーがあれば、小さな影響で改修とかできただろうにね。
356352:2011/12/06(火) 10:17:19.72 ID:???
>>353
一意になってればイイってだけなら数字でいいし若干数字のほうがいい(かも)程度

しかしプロジェクトは大きさに比例してバカ度も増えるんだよ
>>354のようなリスクをわざわざ積むこともあるまい

レコードの表す情報のをどう識別しどう管理するか?を裏でしっかり把握できてれば
キーとなる要素と属性だけで足りるようになるわけだが・・・

そこまでしっかりやってるならわざわざ裏でやって保守性拡張性を落とすこともない
表に出して(主)キーにしてやればいい

>>355
主キーをそのまま画面に・・・じゃなくてその逆だよ
デカい会社で,かつてメインフレーム使ってたところではよくある話
反対してもいいが人が会社がプロジェクトから切られるだけ

そういうところはユーザーがシステムの仕様に口を出すのもよくある話
その思考がCOBOLっぽいのもよくある話
357NAME IS NULL:2011/12/06(火) 13:20:01.30 ID:???
主キーに自然キーを採用して良かった助かったという経験はないな…

>>352
> 3ケタ目4ケタ目が「20」から「46」までを抜き出してよ!とか言われるよ.
文字列を切り出して比較するのと、数値をモジュロと丸めしてから比較するのと何が違うのかしら
358NAME IS NULL:2011/12/06(火) 18:50:19.12 ID:???
>>357
どっちにしろ、B-Treeのインデックスは効かなくなる。
ファンクションインデックスが使えれば、対処できるけど。
359NAME IS NULL:2011/12/06(火) 21:12:35.27 ID:???
質問です。

よく聞く言葉で「帳票設計」がありますが、
これは「DB設計」と同じものと考えてよいですか?
360NAME IS NULL:2011/12/06(火) 21:21:21.66 ID:???
駄目です。
361NAME IS NULL:2011/12/06(火) 21:50:44.59 ID:mrGnDsEe
俺の理解では、帳票=出力だから、
DB設計とか画面設計のことをひっくるめて帳票設計と呼んでいるんだけど、違うのかな?
つまり、外部設計=帳票設計だと俺は思う。
362NAME IS NULL:2011/12/06(火) 22:02:40.02 ID:???
> DB設計とか画面設計のことをひっくるめて帳票設計と呼んでいるんだけど、違うのかな?

違います。
363NAME IS NULL:2011/12/06(火) 22:03:47.67 ID:???
外部設計の定義を間違えている気がします
364NAME IS NULL:2011/12/06(火) 23:48:13.48 ID:???
帳票=紙のことだろ。
コンビニのシステムを例にすると、レシートのことだと思う。
つまり、帳票設計=レシートの表示の設計じゃないだろうか。
レシートの設計を、画面設計と呼ぶとおかしいので、しょうがないので帳票設計ってよんでるのかなって思った。
365NAME IS NULL:2011/12/07(水) 02:46:51.57 ID:???
>>364
ファイルに吐き出すCSVなりExcelなりのファイルを帳票って言うことがある.
いちばん広い意味だと書き込みのない参照画面をすべて帳票って言うこともある.

>>359
いずれもviewだからDB設計だろとコジツケることもできそうだけど,そうではない.
画面に出す場合は独特の機能を作らなきゃならないしね.

次ページ前ページのボタンをつけようかとか複数のソートキーを持たせようかとか
ある項目をクリックしたらサブ画面を開こうかとか,DB屋にやれと言ったら殺され
そうな機能が山ほど必要な場合もある.

また紙に出す場合もどこどこにどういう端末を置いてどういうプリンタをどこに置こうか
紙はどうしようか(シールなど特殊紙の場合もある)とか,そもそもプリンタは何台必要か
とか・・・こういうのもアプリ屋あるいはSEの仕事でDB屋にはさせられない.
366NAME IS NULL:2011/12/07(水) 22:23:55.00 ID:???
>>356
主キーの話って黙って適当な連番とかでサロゲートキー作ってしまうのが無難な気がするけどねえ。
客見せようのユニークなキーは別途作るような感じで。
そのほうが上に乗っかるアプリケーションも影響受けにくいだろうし。
367NAME IS NULL:2011/12/07(水) 22:39:07.98 ID:???
主キーが数値にしろ文字にしろ
レコードの追加時に組み合わせの最大数を超えたときの処理はどうしてますか?
たとえば32bit数値なら32bitの最大値とか
n文字なら利用可能文字のn乗とかを超えたときの話です
368NAME IS NULL:2011/12/07(水) 23:28:06.48 ID:???
>>367
事前にそこまでのデータ量を扱えることを要求するシステムってそうないような気がするけど
どうなんでしょう
データ量の見積もりをあきらかにミスったとかとなれば別ですが

仮にoracleのシーケンスで採番して上限まで使うとしても
毎秒1000万回採番しても約3兆年かかるらしいとかですよ

それ以前にデータ量多すぎて他の見直しが多そ
369NAME IS NULL:2011/12/08(木) 00:06:04.05 ID:???
Key Value Storeを使い倒してるやついるか?
370NAME IS NULL:2011/12/08(木) 00:56:07.12 ID:???
いつもgoogleにはお世話になっている.
371NAME IS NULL:2011/12/08(木) 01:01:14.77 ID:???
memcachedとcassandraにはお世話になっている
372NAME IS NULL:2011/12/10(土) 23:54:11.05 ID:???
DeNAの球団略称がDBになるそうだ.
ますます住みにくい世の中になるな.
373NAME IS NULL:2011/12/11(日) 02:43:05.63 ID:???
mjd?
374NAME IS NULL:2011/12/11(日) 09:58:59.14 ID:???
>>372
そもそもそんな略称めったに目にしないから、関係ないよ。
375NAME IS NULL:2011/12/12(月) 03:03:30.28 ID:???
DB設計の手順教えて下さい
376NAME IS NULL:2011/12/12(月) 03:13:01.72 ID:???
とりあえず必要なデータを紙に書く
関連のあるデータをくっつけていく
おや?勝手に正規化になってるぞ
完成
377NAME IS NULL:2011/12/12(月) 08:14:08.59 ID:???
>>376
参考になります
378NAME IS NULL:2011/12/12(月) 09:27:49.02 ID:???
>>375
 ビジネス要求をまずはハッキリさせる.
 システム全体のスコープを決める.
 ハードウェアミドルウェア等の既存制約,予算制約を確認する.

 アプリとの棲み分けをきめる.
 3層だか4層だかSOAだかアーキテクチャを決める.
 DBのサポート範囲をきめる.
 運用ルール共通規約など決める.バックアップなんかもここで考える.

 DBの対象とすべきデータの構造を調べる.
 相互の関連性,依存性,寿命(変更・拡張の可能性と頻度)を調べる.

☆データをたばねたりバラしたり,最適配置を考える.
 移行手順はその思考過程からひっぱりだしておく.

☆設計書を書いてDDlをかく (自動化してればDDLを吐かせる).

DB設計というと☆のついてるところだけを考えがちだが,そこだけ
いくら考えても元ネタがなければ動けないよ.
ぜんぶやるつもりで入って,たまたま他人がやってくれてる部分があれば
ラッキー位に思っておいたほうがいい.
379NAME IS NULL:2011/12/12(月) 22:26:44.20 ID:???
>>378
具体的な指摘ありがとうございます。
とてもわかりやすかったです。
380NAME IS NULL:2011/12/14(水) 15:44:51.29 ID:???
販売管理で消費税を商品の1つとするパターンと
スキーマに含めるパターンとどっちが流行り?
381NAME IS NULL:2011/12/14(水) 22:44:57.03 ID:???
消費税をどの単位で計算して丸めるかによってかわるんじゃね
382NAME IS NULL:2011/12/15(木) 00:14:27.45 ID:???
消費税は比率なんだから、商品の一つとみなすのは明らかにおかしいだろ
383NAME IS NULL:2011/12/15(木) 01:25:22.90 ID:???
>>382
商品というよりは、計上科目として分けて保持するか、商品に従属する項目として保持するか、どっちがメジャー聞きたいんじゃないのかな?

経理的なところまで面倒見るなら、わけた方が扱いやすいだろうし、そうでなければ従属させた方がいいんじゃないかな?
384NAME IS NULL:2011/12/15(木) 01:46:09.21 ID:???
消費税率が変わったときにラクなのはどっちだ?
追加でカネをとる口実を作りやすいのはどっちだ?

家電や外食じゃないんだから「いま売れてます」に飛びつくのはやめようよ.
385NAME IS NULL:2011/12/18(日) 22:40:19.87 ID:???
つまり、どうするのがいいんだ?
386NAME IS NULL:2011/12/18(日) 22:59:37.92 ID:???
今後の消費税法しだい
387NAME IS NULL:2011/12/19(月) 01:24:36.10 ID:???
変動要素は税率変更くらいだろう
あと税率の段階,外税化が可能性としてある

いちおう全部を挙げておいて「考えられるのはコレくらいですよね」
⇒設計に生かす

その上で「税率以外は次ステップということにしましょうかXX円かかりますし」
⇒今後の飯の種をのこす
388NAME IS NULL:2011/12/19(月) 10:27:06.98 ID:???
わざわざ内税にさせたぐらいだからいまさら外税化はないだろう。
食品の税率据え置きとかありそうだ。
引き下げならサプライズだが。

389387:2011/12/19(月) 23:13:51.33 ID:???
>>388
いやいやそういうツッコミを入れてもらうための撒き餌だから.
そういう撒き餌で「そんなのいらないよ」に口を慣らす.

「それいらない」「そっちは今度でもいいか」「これだけは・・・必要・・・かな?」

あとでもめないコツは後から作りこむといくらになるか言っておくこと.
むろんいま追加するといくらかも言っておくこと.

なお避けるべきは「やりすぎ」コレ重要.
要件の見極めができないコイツ業務分かってんのかと思われたらアウトね.
390NAME IS NULL:2011/12/23(金) 01:15:38.49 ID:???
今度うちにいれるシステムは、
3つのパッケージの組み合わせらしいが、
DBがポスグレ、オラクル、SQLサーバとバラバラらしい。
パッケージ間の連携がキーになるシステムなのに、
正気とは思えん…

メンテナンス担当になりませんように!
391NAME IS NULL:2011/12/23(金) 08:26:07.84 ID:???
>>390
共通プラットフォームと称してまたDBを追加だ!
ここまで来たら今度はDB2かSymphowareか・・・

しかしメインフレームが残ってなくてよかったな。
392NAME IS NULL:2011/12/23(金) 14:23:55.35 ID:???
>>390
そんな案件いくらでもある
いちいち気にすんな
393NAME IS NULL:2011/12/25(日) 19:20:29.27 ID:kGsuJlPZ
KVSでの設計でよく「非正規化」という話を聞くのですが、
例えば、RDB的な「受注(仮に1受注=1商品とすると」テーブルなら受注レコード1件に
「商品ID」、「購入者ID」などの外部キーで持つと思うんですが、
これを
「商品名」、「購入者名」のような形で持ったとして、
商品名がかわったり、購入者名が変わった場合に該当する全ての
受注データを更新することになるとおもうんですが、
そこはKVSなら処理的に問題にならないほど速いということなんでしょうか?

RDBでいう非正規化しないデメリットの部分が、KVSで非正規化した際に
どう解消(または緩和?)されるのかという具体例をあまり見つけられなかったので質問してみました。
394NAME IS NULL:2011/12/25(日) 21:02:27.86 ID:???
考え方が逆。
そういうデメリットのない用途にKVSを使う。
395NAME IS NULL:2011/12/26(月) 05:50:57.82 ID:???
>>393
RDBであえて非正規化するメリットと同じじゃないかな…
396NAME IS NULL:2011/12/26(月) 07:17:16.40 ID:???
じぶんなりの考えだけど
現実のビジネスだと購入者や単価が変わったとき過去のデータまで更新する必要ってあまりなくて、むしろ変えてはいけないケースの方が多い気がする
総売上が変わったり不都合
前に出た消費税でも今年は5%で計算して、8%になったらそれ以降8%にしないと困る
RDBでも消費税変更を見越して設計してれば大丈夫だけど、そうじゃないと大変なことになる
KVSは勉強中だけどKVSのほうがその辺がまだ柔軟に対応できるイメージ
397393:2011/12/26(月) 19:51:03.94 ID:???
>>394
ではこういうケースは「そういう用途」にはならないということになるんですかね。
普段業務アプリケーションを作っていると、
じゃ、具体的にどういう用途に向くんだろう?と。

>>395
RDBでの非正規化のメリットとして自分が思っているのは、
正規化の基本を第3正規形とすると、それで得られる一番のメリットは
「1事実1箇所」のメリットと思うんですが、そのメリットを超える
データ取得時のパフォーマンス向上を得られる、というメリットなのですが、
そういうことですか?

>>396
受注した瞬間に消費税が確定するのであれば、そうかも知れませんが、
おそらく通常はそうではないですよね?(出荷時になるんじゃないかな?)

「受注」を例にしたのがまずかったのかもしれませんが、
まぁ、そこは大きな問題じゃなくて、
疑問に思ったのは正規化しない場合に後から変更された場合を
・考えないような用途に向いているからそういう場合に使うんだ。
なのか
・考えるが、RDBでの「普通」とは違うなにかKVSならではの対応方法があるのか?
というのを知りたかったんです。
398393:2011/12/26(月) 20:16:57.46 ID:???
>>396
>>むしろ変えてはいけないケースの方が多い気がする
すいません。
ということは、
>考えないような用途に向いているからそういう場合に使うんだ。
のケースが実は多いんじゃないか、というお考えなわけですね。
399NAME IS NULL:2011/12/26(月) 21:38:41.80 ID:???
>>397
KVSって、第一非正規形を扱えることを除いたらデータモデル的には
キーが1つだけのテーブルと変わりがないでしょ。KVSに何を期待してるのか
いまいちわからんけど、さまざまな用途にオールマイティに対応できるのは
やっぱりRDBだと思うよ。

で、>>393をKVS的に解決するとしたら、商品IDをキーとする商品テーブルに
複数の受注データを持たせるというやり方が考えられるけど。
商品( _商品ID_, 商品名, 受注[] ) こんな感じ。
400393:2011/12/26(月) 22:13:01.27 ID:???
>>399
>KVSに何を期待してるのか
何かすごいことを期待してるかというより、何に向いていて何に向いていないのかを
自分が普段している業務で具体的にどんなものがあるんだろう?という感じです。

結果、自分の周りにそのような対象は無いとわかればそれでいいですし、
こういう使い方が出来るというのがわかればそれはそれでためになるな、というのを
自分の具体的な仕事を書くわけにも行かないので、例を上げて聞いて見ました。

>商品( _商品ID_, 商品名, 受注[] ) こんな感じ。
KVSはあるkeyから特定のHashへのポインタを持っているイメージなんですが、
商品IDというkeyに対して、受注1、受注2、受注3・・・受注Nというように
属性が増えていく感じになるんですか?
401NAME IS NULL:2011/12/26(月) 23:27:51.55 ID:???
Hashへのポインタ?特定の実装の話か?にしてもいまいち意味不明だが。
いちどちゃんとKVSについて調べてみた方がいいと思う。
402NAME IS NULL:2011/12/26(月) 23:54:27.63 ID:???
>>400
KVSが向いてるのは,ひたすら大量データがたまっていくが更新はそんなにないもの.
正確じゃないが「テーブルじゃなくてインデックスにこそ用がある」時につかうもの.

商品の例だとコンビニやら量販店やらのPOS情報を分析して需要予測たてるような用途.
気温が何度でどの地方(駅前,郊外,住宅街,学生街 etc)でどんなものが売れるか.
コンビニなんかだと日単位時間帯単位でモノを店から店に動かしたりする.

⇒大量データでスピード処理,単一または最小限の応用(この場合は分析)
 全国のPOSの取り方をいっせいに変えるんじゃなければ過去のデータなど付け替えない

会社の業務全体を回すような用途はRDBになるよ.
ちなみに非正規化ってのは,レスポンスとデータ永続性のバランスのための方便.

選択肢はたとえば・・・
実際に使う重複ありデータをメモリ上データをオブジェクトで持つか,それともDB側で持つか.
DB側で持つのもキャッシュで持つかテーブルそのものに持たせたいか.

これはマシンにもよるしDBの選択や設定にもよるしプログラマの質にもよる.
まあ選択肢がある程度ハッキリするだけでも役に立つんじゃないかな.
403NAME IS NULL:2011/12/27(火) 00:12:28.51 ID:???
それだけ読むとDWHの話みたい。
404NAME IS NULL:2011/12/27(火) 02:13:46.67 ID:???
で、いいとおもう
405NAME IS NULL:2011/12/27(火) 06:33:34.42 ID:???
ですな。

付け加えると、KVSの使いどころ。

・分析用としていろいろなデータを突っ込んどきたい。設計段階で確定?無理です。その度にAlterTable?サービス止められません。
・とにかくオンメモリDBとして更新の速さが要求される。(揮発性のデータを永続化DBにストアとかアホのすることだと思っている)
・DWHアプライアンス高くて買えないのでコモディティサーバーでクラスタリングしたい。

といったところじゃね。
406NAME IS NULL:2011/12/27(火) 21:24:08.48 ID:???
結局のとこ、機能をしぼって、大量データをあるていど高速にさばけるようにしただけのものなんじゃないのか
407NAME IS NULL:2011/12/28(水) 00:46:50.34 ID:???
業務アプリ屋からしたらその通りなんだけど.
機能を絞っても,そうそうスケーラビリティもレスポンスも出せるもんじゃないよ.

MapReduceも「別に新しい発想じゃない」って最初から断ってるくらいで,これは
原理が偉いんじゃなくて実装よくやったなあという所が感心するポイントだと思う.

あとGoogleなんかでは一部がコケても処理がコケないことを重視してる.
絶えず更新されてる世界中のサイトの表示順位がおかしいという文句は出ないけど
検索が遅いと不満が出るから.
408NAME IS NULL:2011/12/28(水) 06:41:50.91 ID:???
中身はデタラメでもレスポンスだけはするってタイプか
最悪だな
409NAME IS NULL:2011/12/28(水) 20:45:17.52 ID:???
母数が巨大で計算(点数付け)は統計処理だからデタラメではない。

カッチリやろうとすると東証くらいのデータでもそれはそれは大変なことになる。
410NAME IS NULL:2011/12/30(金) 11:30:02.36 ID:???
>>408
目的に合った設計もできないタイプか
使えないな
411NAME IS NULL:2011/12/31(土) 05:39:22.52 ID:???
すいません、ちょっと質問です。
異なるDB間(例えばオラクルとSQLサーバ)で
データの一貫性を保つにはどうするのが
一般的でしょうか?

ひとつのトランザクションで処理できないですよね?
すると、片方のDBでコミットしてる間に、
もう一方のDBで予期せぬエラーが発生して
ロールバックがかかると整合性が取れなく
なっちゃいませんか?
412NAME IS NULL:2011/12/31(土) 06:11:48.39 ID:???
>>411
SQL Server→Oracleならリンクサーバ
Oracle→SQL ServerならDBリンク
で一本で処理できる

ミドルウェアで2本コネクション持ってるなら
片方こけたらリカバリーできるようにするか
リトライで問題なく処理できるように設計するしかないかな
413NAME IS NULL:2011/12/31(土) 07:22:01.25 ID:JKr2ftqV
DBのチンポコは小さい!
414NAME IS NULL:2011/12/31(土) 08:20:21.45 ID:???
さむいな
415NAME IS NULL:2011/12/31(土) 12:52:35.19 ID:???
MySQLが混じった場合も、同じやり方でいいのでしょうか?
416NAME IS NULL:2011/12/31(土) 14:27:02.07 ID:???
>>415
ちょっとは自分で調べたのか?
417411:2012/01/01(日) 09:15:15.39 ID:???
>>412
レスありがとう。
ヒントはもらったので調べてみます。

ちなみに415は私じゃありません。
418NAME IS NULL:2012/01/01(日) 12:00:49.22 ID:???
MySQLで以下のことで検討してます
データベースを1つ
テーブルを1つ
カラムに次の3つ(id,name,flag)
idは連番
nameはvarchar(100)
flagはintで0か1の値

一日に20万件のflagの書き換えを行うのですが
この場合ってテーブルを分けたほうがよいでしょうか?
419NAME IS NULL:2012/01/01(日) 14:06:46.98 ID:3N9Kd99w
>>418
分けたほうが吉
420 【大吉】 【1867円】 :2012/01/01(日) 14:29:19.00 ID:???
>>418
分けないほうが大吉
421NAME IS NULL:2012/01/01(日) 15:08:37.73 ID:???
なぜ分けた方がいいと思ったのかと、どう分けようとしているのかが
書いていないが、もしパフォーマンスを心配してのことであれば、
実際にそれが無視できないくらい悪いことを確認してから考えろ。
422NAME IS NULL:2012/01/01(日) 18:08:30.96 ID:3N9Kd99w
>>420
VIPに帰れ
423 【豚】 【739円】 :2012/01/01(日) 19:07:54.09 ID:???
八つ当たりかこわる
424NAME IS NULL:2012/01/01(日) 19:31:14.75 ID:???
20万件もあるなら分けるだろ普通
書き込むたびに20万件のデータ開くの頭おかしいだろ
425NAME IS NULL:2012/01/01(日) 19:44:16.43 ID:???
テーブルを分けるのは最後の手段だな
たかが20万程度で本当に問題がでるのかやら
パーティショニングやら他に検討すべき事があるんじゃないかな
426NAME IS NULL:2012/01/01(日) 19:50:14.80 ID:???
>>424
>書き込むたびに20万件のデータ開く

正直、なに言ってるのかさっぱりわからん。
427NAME IS NULL:2012/01/02(月) 00:18:08.94 ID:???
いったん結果セットを取ってこないと更新できない、とでも思ってるんじゃない?
428NAME IS NULL:2012/01/02(月) 02:41:41.47 ID:???
俺も1日で20万件程度なら、わざわざテーブル分けなくてもと思うけど。
なぜ分けようと思ったのか?
429NAME IS NULL:2012/01/02(月) 02:44:08.96 ID:???
固定長になるから
430NAME IS NULL:2012/01/02(月) 05:28:39.52 ID:???
バカすぎて何イッてるかさっぱり。
放置でいいよ
431NAME IS NULL:2012/01/02(月) 14:47:46.82 ID:???
>>418
全部で何件中の20万件なのか?20万件中の20万件なのか
1億以上あるデータのうち500分の1程度の書き換えがあるのか。

随時トランザクションが一件ずつ飛び込んでくる合計が一日20万件なのか
数千件ずつなのかそれともバッチ的に全件ガツンと書き換えるのか。

分けたいってのはレコードを分散したいのかIDとフラグだけのテーブルを
設けたいということなのか。

レスポンスの要件、それから整合性の要件は何か。
フラグが書き換えられたレコードは次の瞬間からフラグが書き換わった状態
としてふるまう必要が本当にあるのか、24時間いつでもそうなっていないと
いけないのか。

・・・と書いてはみたが、言いたいことが伝わったか不安。
432NAME IS NULL:2012/01/02(月) 23:08:45.10 ID:???
>>431
20万件じゃよほどじゃねーと要らねーよ
まで読んだ
433NAME IS NULL:2012/01/02(月) 23:13:59.41 ID:???
煽るような薄いレスじゃないだろw
434NAME IS NULL:2012/01/07(土) 16:49:17.00 ID:???
注文明細で、総額=商品金額+消費税−使用ポイント−値引き
みたいな場合、使用ポイントと値引きのカラムにはマイナスの値を
入れるようにしたほうがいいものかな?
435NAME IS NULL:2012/01/07(土) 17:31:14.80 ID:???
>>434
って、縦持ちにするんだよね?
注文番号,明細番号,項目名,金額
みたいな構造にするならそれぞれ正負の値を入れておくべきだね。
436NAME IS NULL:2012/01/07(土) 17:34:13.68 ID:???
販売管理だから縦にする必要がないんでしょ。

437NAME IS NULL:2012/01/07(土) 17:38:20.24 ID:???
でも、縦にしてた方が拡張性ありそうだけど。
438NAME IS NULL:2012/01/07(土) 17:55:38.22 ID:???
%引きのポイントがあってだな
439NAME IS NULL:2012/01/07(土) 19:18:04.20 ID:???
割引が複数合ったときの取り扱いとかもあってだな
440NAME IS NULL:2012/01/07(土) 20:26:52.41 ID:???
後出し大杉。でも縦持ち推奨だわ
441434:2012/01/07(土) 21:45:20.75 ID:???
ただのネットショップのシンプルなシステムだし、
1レコード=1明細でいいと思ってた(横持ちってこと?)。
442NAME IS NULL:2012/01/08(日) 02:35:30.95 ID:???
値引きはマイナスで格納に一票。
443NAME IS NULL:2012/01/08(日) 03:20:10.85 ID:???
横持ちの方が実装が楽よ
あるかも分からない拡張のために実装してはないと偉い人も言ってた気がする
444NAME IS NULL:2012/01/08(日) 04:43:56.13 ID:???
データモデルはおいそれと変えられないから
データこそが偉い!ってのが
このスレに集うような人たちの主張じゃなかったん?
とりあえず思考でデータモデル作ることの擁護を
プログラム作る時のパラダイムで語られてもなあ
445NAME IS NULL:2012/01/08(日) 09:34:47.01 ID:???
>>441
こんなところで聞かなければ解決できないなら1レコードにすべて格納した方が良い。
446NAME IS NULL:2012/01/08(日) 15:25:56.13 ID:???
直接関係ないが、とあるシステムで端数処理をする関数部分で
絶対値をとるようにしてなかったせいで、マイナスの端数が合わなかったことがあった。
それ以来、数値はマイナスを入れないようにしてる。
447NAME IS NULL:2012/01/08(日) 17:42:16.26 ID:???
>446
床関数と天井関数を、単純に切り捨て切り上げ関数と勘違いしたアホ発見。
448NAME IS NULL:2012/01/08(日) 18:26:47.25 ID:???
>>447
なんでその二つに限定できたの
449NAME IS NULL:2012/01/08(日) 18:57:52.53 ID:???
それしか知らないアホだからでしょう
450NAME IS NULL:2012/01/08(日) 19:29:10.07 ID:???
アホの定義が分からないから議論に参加出来ません
451NAME IS NULL:2012/01/08(日) 22:27:57.91 ID:???
いや俺じゃなくて、分かってないやつが
端数処理の関数を書いたってこと。

そういうやつも要るから、データ側では
なるべくマイナスの値を持たないようにしてる。
452NAME IS NULL:2012/01/09(月) 08:07:16.04 ID:???
そういう現象が発生するのは、集計の前に丸めが行われる勘定とかか?
どちらにしてもそれは単に仕様通りに作っていないだけのように思うが。
マイナスの値を使わないようにしたというのが対策だというなら、もしかすると
仕様自体明確に指示していなかったんじゃないだろうか。
453NAME IS NULL:2012/01/09(月) 09:36:03.68 ID:???
>>452
>仕様自体明確に指示していなかったんじゃないだろうか。

俺もそう思う。

根拠は、

>それ以来、数値はマイナスを入れないようにしてる。

って言うアホな対策しかできないような組織だから。
454NAME IS NULL:2012/01/09(月) 10:05:03.53 ID:???
数値はマイナスを入れないとかいう対策を見ると0のときが心配になるな。
0 Divideを避けるために0は使用しないとかw
455NAME IS NULL:2012/01/09(月) 13:54:39.62 ID:???
仕様書に小数点以下は切り上げるとだけ書いてあったら、マイナスの時どうする?
456NAME IS NULL:2012/01/09(月) 14:10:21.09 ID:???
仕様書書いた奴に、「マイナスのケースも明記してね。」と言う。
457NAME IS NULL:2012/01/09(月) 14:10:42.52 ID:???
プログラマ依存w
458NAME IS NULL:2012/01/10(火) 06:07:26.37 ID:???
>>455
丸め方法は明記してくれないと。
459NAME IS NULL:2012/01/10(火) 19:33:51.64 ID:WtFu2VCV
もしかして、アカウントを作成するときの
"Sign up for a free 5 user account(五人までの面子で使える無料1アカウント)"
を読んで勘違いしたのだろうか。
460NAME IS NULL:2012/01/10(火) 19:34:12.18 ID:WtFu2VCV
果てしなく誤爆した。ごめんなさい。
461NAME IS NULL:2012/01/15(日) 10:24:38.07 ID:IFrfONHm
SNSでユーザがグループAとグループBにわけられていて、
「管理者側からグループAに属するユーザ全員にメッセージを送る」
という機能があるとします。
この前提で、ユーザ一人一人にメッセージへの既読チェック機能を持たせるとしたら
メッセージのテーブルはどうしたらいいでしょうか

id/to_userGroup/to_userId/message/is_read
個別のユーザへのメッセージなら、以上の構成で良いと思うんですが
全員相手のメッセージだと、既読フラグ(is_read)をどう持たせたらいいのかわかりません
どのように作るのが一般的&効率的ですか?
462NAME IS NULL:2012/01/15(日) 12:03:46.39 ID:???
メッセージと既読フラグを別に持てばいいだけじゃね?

Table: messageTable
 id
 to_userGroup
 message

Table: readStatus
 messageId -- reference to messageTable.id
 to_userId
 is_read

送信する時に、message を messageTable に挿入して、
ユーザーに送信する (もしくは送信先を設定する) 度に
readStatus に messageId と to_userId のセットを挿入
すればいいと思う。

もちろん挿入時は is_read は false にして、読んだよ〜イベントで
true にすればいいだけかと。
463NAME IS NULL:2012/01/15(日) 14:55:23.05 ID:???
個人ごとに読んだかどうかなんだから
グループに送ろうが個人におくろうが、個人に送られてきたメッセージの既読処理をするだけだと思うが
464NAME IS NULL:2012/01/15(日) 22:46:34.36 ID:???
>>462,463
どうもありがとうございます
既読チェック専用のテーブルを別に用意するべきなんですね〜
参考にして作ってみようと思います
ありがとうございました
465NAME IS NULL:2012/01/18(水) 05:02:12.60 ID:???
IDを文字列にするとか数値にするとか議論があったけど、
文字列にする場合もシーケンスでやるのが定石?
それとも別の方法が何かあるのかな?
466NAME IS NULL:2012/01/18(水) 06:38:23.34 ID:???
>>465
お作法の話の元は
「IDに業務の都合を入れるな、話がややこしくなるから」
「どうせならIDはシステムに都合のいい数字がよい」
だよ。

システムにもいくつか都合がある。
ソートしやすいとか容量くわないとかいうキカイの都合
発行順序が分かりやすいというようなシステム屋の都合

これからつくるシステムの固有要件に対して何か思いつけば
キカイに都合のよい「そういう文字列」にしてもいいんじゃない?
思いつかないけど。

いっぽうシステム屋の都合を拡大して文字列にルールを持たせると
「IDに業務の都合を入れるな、話がややこしくなるから」
をシステム屋が自分で踏みにじることになる。

そうなる位なら、数字にすると始めから決めてかかるほうが無難。
467NAME IS NULL:2012/01/18(水) 06:44:43.02 ID:???
文字列派の意見ってどんなだ?
468465:2012/01/18(水) 14:16:02.76 ID:???
限りなく実装に近いレベルの話でスマソ。でもSQLの話じゃないし。。。

N88からAccess MDBに移植されたものを、PostgreSQLへ移植中なんだが、

仕入ID I[年][月][番号] 出荷ID E[年][月][番号] みたいになってる。
たとえば、I2012010001 で、2012年1月の仕入1回目。

移植案件でデータ引継ぎもあるから、そのまま移植しようと思うのだが、
元のシステムはナンバリングデータテーブル(プレフィックス 現在値)を持ってて
VBAで作った共通関数でカウントアップしてる。

ナンバリングデータのテーブルなんて他で見た覚えがないので、
シーケンスで作り直そうかと思うんだが、定石なのかどうか知りたい。

他の人が引き継いだ時できるだけ戸惑わないようにしたいんだ。
469NAME IS NULL:2012/01/18(水) 15:21:23.17 ID:???
>>467
オラクルならcharだろ?
470NAME IS NULL:2012/01/18(水) 15:26:03.67 ID:???
>>469
それが理由?速度がどうとか利便性がどうとかじゃなく、オラクルだからchar?
471NAME IS NULL:2012/01/18(水) 15:28:45.59 ID:???
>>468
採番テーブルともいうが、割とよく見る。
シーケンスで作り直せるのならそれでもいいんじゃない
472NAME IS NULL:2012/01/18(水) 15:30:23.92 ID:???
たとえば都道府県名だったらidいらないんじゃないとか
473NAME IS NULL:2012/01/18(水) 15:36:53.01 ID:???
>>472
>>465
> 文字列にする場合もシーケンスでやるのが定石?
これって、数値文字列にするって話じゃないのね。
474NAME IS NULL:2012/01/18(水) 17:13:33.32 ID:???
>>472
何も考えずに市町村コード使ってるが・・・。
475NAME IS NULL:2012/01/18(水) 18:53:44.17 ID:???
>>474
全然Naturalな設計でしょ
476NAME IS NULL:2012/01/18(水) 19:14:29.09 ID:???
>>470
オラクルは金額や数量以外の項目にCHAR以外を使うとくなことにならん。
477NAME IS NULL:2012/01/18(水) 19:33:03.58 ID:???
全部Varchar2が多数派のような気がするが。
478NAME IS NULL:2012/01/18(水) 19:34:53.48 ID:???
charを使わないって意味ね
479NAME IS NULL:2012/01/18(水) 19:47:37.07 ID:???
日本語に難のあるレスが多いな
480NAME IS NULL:2012/01/18(水) 20:29:40.38 ID:???
>>476
まじで?めんどくさいね
481NAME IS NULL:2012/01/18(水) 21:54:59.37 ID:???
http://d.hatena.ne.jp/iad_otomamay/20110808/1312805917
オラクルだからcharっていうのは、ここに書いてあるようなことが理由なのかな
482NAME IS NULL:2012/01/18(水) 23:09:13.73 ID:???
>>481
?がいっぱい浮かんだけど、Oracleには固定サイズの数値型というものが存在しないことを知って理解した。
普通に32bit整数型とかあるんもんだと思ってた。

PostgreSQLでいう、ストレージがPLAIN以外に設定されたカラムを使うときのペナルティみたいなもんなのね。
勉強になった。

JOIN禁止はすんなり理解した。
483NAME IS NULL:2012/01/19(木) 00:24:00.50 ID:???
アホらしい。Oracleを使う意味が無い。
MySQLで十分だね。
484NAME IS NULL:2012/01/19(木) 02:26:40.03 ID:???
それで要件を満たせるなら俺も十分だと思うよ
485NAME IS NULL:2012/01/19(木) 02:47:48.87 ID:???
んだね。要件次第
まあ一度くらいはこういう案件やっておくといいと思う。エンジニアとして
二度は、オレは御免こうむるがw
486NAME IS NULL:2012/01/19(木) 12:46:05.42 ID:???
可変長だと、行移行とそれに伴うデータ領域の断片化を気にしないといけない。
データが大規模で、定期的な保守停止ができない場合致命的。
あと規模に関係なく、半角スペースとnullの扱いに癖があるからね。
487NAME IS NULL:2012/01/19(木) 13:30:21.79 ID:???
>>486
上2行は>>481を薄めたものなのはわかる。
最後の行くわしく
488NAME IS NULL:2012/01/19(木) 21:43:50.26 ID:???
可変長文カラムだと、末尾に空白の有無により、パディングしてやらないと抽出条件としてマッチしないこと。
だからといって半角スペースだけの値をtrimするとnullとしてあつかわれてしまうこと。
この辺りをわざわざ毎回考慮しないといけない。
charでnull禁止にしておけば、この辺り気にする必要がなくなる。
489NAME IS NULL:2012/01/19(木) 22:02:06.96 ID:???
え?
490NAME IS NULL:2012/01/19(木) 22:05:26.88 ID:???
>>488
つまりORACLEは空文字列とNULLの区別がつかないということか
491NAME IS NULL:2012/01/19(木) 22:12:09.97 ID:???
長さゼロの文字列とNULLが同じってのがOracle最大の汚点だよなあ
後方互換のためにもうずっと変えられない仕様なんだろうけど
492NAME IS NULL:2012/01/19(木) 23:37:36.74 ID:???
そしてnullは主キー項目になれないという制約があるから、複合キーの項目なんかに必ずしも埋まらなくても良い可変長文字列なんかがあると非常に扱いに困る。
それなら最初から固定長にしてダミー値をセットするか空白が埋まっている方がマシ。
493NAME IS NULL:2012/01/19(木) 23:38:26.66 ID:???
もっと低レベルの話もある。
ある会社だが取引先コードは数字で10ケタ固定にしている。
DBMSは標準でOracleを使ってる。
その会社の、とあるシステムでは取引先が8ケタだったり7ケタだったり
なぜか一定ではない。

「何スかコレ?」
「いやあ移行のときにエクセルで設定したら頭のゼロが無くなっちゃってね」

そこを直すと、次の移行でデータの整合性が云々という話になって結局
全社ルールにもキチンとしたDB設計にもあわないマスターになった。

悪いのはビルゲイツかラリーエリソンか情報システム部か?
494NAME IS NULL:2012/01/19(木) 23:40:42.20 ID:???
いやエクセル悪くないだろ
猫に小判、ブタに真珠ってことだろ
495NAME IS NULL:2012/01/19(木) 23:44:12.40 ID:9Ib5oc5g
情報システム部 に1票
496NAME IS NULL:2012/01/20(金) 00:41:33.57 ID:???
>>490
そうだよ。

というか、char型なら普通スペースが埋められるだろ。
null文字列じゃないだろ。

だから検索条件にtrim()を使うから
Hashインデックスは効かないんじゃねーの?
Btreeだったら効くけど非効率だよね。
497NAME IS NULL:2012/01/20(金) 00:49:14.22 ID:???
変な日本語になっちゃった。

検索条件でいちいちRPAD(だったか忘れたが)する必要がある。
もしくは毎度trimを書く必要がある。
この場合ファンクション索引を使わない限りインデックスは効かない。

よね?
498NAME IS NULL:2012/01/20(金) 02:32:58.04 ID:???
>>496
trim(col)でインデックスはればいいんじゃね?とおもったけど、結局 trim(col) == '' みたいなことができない以上どうにもならんのか。
なんというか、やりにくいねw

将来変更されるかもしれないから、 '' がNULLであることを期待したSQLを書くなとマニュアルにはあるけれど
変わらないままずーっときてるのね
499NAME IS NULL:2012/01/20(金) 03:09:21.64 ID:???
そこ変えたらIT業界に好景気がくるぞ
500NAME IS NULL:2012/01/20(金) 03:16:25.16 ID:???
>>492
>そしてnullは主キー項目になれないという制約があるから、複合キーの項目なんかに必ずしも埋まらなくても良い可変長文字列なんかがあると非常に扱いに困る。

それで困るケースが想像つかないわ。
あったとしても
'(NULL)'なり'-'なり適当に入れてやればよいわけで。
どっちみちNull文字列を入れられるDBでも重複はできないわけで。
501NAME IS NULL:2012/01/20(金) 03:20:36.24 ID:???
やはり主キーにヌル文字列が入るケースは想像しにくい。
カバリングインデックスにして性能アップしようとか考えないほうがいいで。
502NAME IS NULL:2012/01/20(金) 03:58:13.40 ID:???
>>500
NULLは複数入れられるよ。
503NAME IS NULL:2012/01/20(金) 04:42:09.61 ID:???
ああ、複合主キーだったら複数入るか。
504NAME IS NULL:2012/01/20(金) 06:02:52.38 ID:???
>>502
単一カラムのUNIQUE制約でさえもNULLを複数入れられるDBMSと
入れられないDBMSがあるよ
505NAME IS NULL:2012/01/20(金) 07:47:16.02 ID:???
可変長の属性でもchar型にしてるとかって、本気でそんなこと言ってるの?

可変長の属性でもなんでもchar型にしちまったら、データ量が増大するじゃねぇか。
バックアップの時間が伸びるとか、
char型のカラムにインデックスを貼ったらインデックスサイズが大きすぎて非効率になるとかいう
考えはなかったの??

行移行させてしまうようなテーブル設計・DB設計にも問題あるし、
データが大規模であれば当然パーティション設計してるだろ。
断片化解消したいんならパーティション単位に shrink space とか打てば業務中でも可能だろ。
まぁテーブル単位でも大丈夫だろ。
業務アプリがレコードをロックしっぱなしって事が無ければな。

半角スペースとnullの扱いは、困ったもんだねぇ・・・
Oracleがvarchar3とかいうような奴を新規にリリースしたら良いと思うが困難なのかね。
506NAME IS NULL:2012/01/20(金) 12:08:53.05 ID:???
MySQLみたく、エンジンを切り替える方法とか?
でも、格納方法に起因するものだとすると、これだけではダメか。
507NAME IS NULL:2012/01/20(金) 15:35:05.46 ID:???
RTRIM(列) IS NULL
で空白がいくつだろうがNULLだろうが一括で引っ掛けられるのは
便利だったけどな。パフォーマンスもそんなに悪くなかった。
SQL Serverにいったとき面倒だった。GUIの見た目でわからんし。
508NAME IS NULL:2012/01/20(金) 16:45:46.15 ID:???
>>507
char型って、ユーザが意図していれた空白かどうかがわからないところが問題だと思うの。
509NAME IS NULL:2012/01/20(金) 16:52:35.73 ID:???
>>508
そんなものまで区別したいならbinaryにしておけよ
510NAME IS NULL:2012/01/20(金) 17:33:42.38 ID:???
そんなもの、といわれてもなぁ。
可変長ならそれがわかるじゃん。
511NAME IS NULL:2012/01/21(土) 00:28:35.17 ID:???
なんかOracle質問総合スレに神が現れたぞ。

144 名前:NAME IS NULL[] 投稿日:2012/01/20(金) 22:52:50.75 ID:96O4svvI
こんなことありえるか?

朝出社したらインスタンスが落ちててコールの嵐。
なぜ・・・?と思ったらオペレーターがディスク閾値を超えたから以下を実行したらしい。

sudo cp -p /opt/app/oracle/11.2.0.2/product/db1/admin/bdump/* /tmp/log/
sudo rm -Rf /opt

/opt配下のディレクトリ構成

/opt/data
/opt/redo1
/opt/redo2
/opt/arc
/opt/conf
/opt/tmp
/opt/rman

おれはそれを聞いた瞬間、職場を出て未だにファミレスにいる
イロイロ



クソワロタww
おまえらアドバイスしてやれ
512NAME IS NULL:2012/01/21(土) 01:04:12.44 ID:???
ワロス
逃げちゃダメだ逃げちゃダメだ逃げちゃダメだ?
513NAME IS NULL:2012/01/21(土) 01:14:21.54 ID:???
そういうオペレーターにルート権限を渡してはいけない
514NAME IS NULL:2012/01/21(土) 01:56:59.64 ID:???
ありえねえ・・・
オペレーターも大概だが、こんなのにやらせてる組織の方が
まあネタであることを祈る
515NAME IS NULL:2012/01/23(月) 03:40:05.00 ID:HdAvUfuX
・タイトル
・ユーザー名
・パスワード
・メッセージ
上記のような項目をもった投稿テーブルがあって、
そこにログインしているログインユーザーと、
ログインしていない非ログインユーザーどちらからも書き込めるようにしたい
ユーザーテーブルは
・ユーザー名
・パスワード
といった投稿テーブルがもっている項目と同じ項目を保持している
非ログインユーザーからの書き込みはそのまま
投稿テーブルの項目を全て保存すればいいんだけれど、
ログインユーザーからの書き込みは同じ項目があるので、
その扱いをどうするか悩んでます。

今考えている案は、
投稿テーブルに
・ユーザーID
を外部IDとしてもって、そこに値が入っていれば
ユーザー名やパスワードなどはユーザーテーブルを参照する
という方法です。

これ以外に思いつかないんですが、
何かもっとスマートな方法はありますでしょうか
516NAME IS NULL:2012/01/23(月) 03:56:25.75 ID:???
>>515
項が曖昧だ。
まずパスワードという言葉を「ログインパスワード」と「(メッセージごとに異なる)メッセージ削除専用パスワード」の二つの意味で使っている。
他にも全体的にぐだぐだだ。
何をしたい?
517NAME IS NULL:2012/01/23(月) 04:01:38.61 ID:???
>>515
> 今考えている案は、
> 投稿テーブルに
> ・ユーザーID
> を外部IDとしてもって、そこに値が入っていれば
> ユーザー名やパスワードなどはユーザーテーブルを参照する
> という方法です。

奇妙だな。
まず投稿テーブルを見て、複数行の取得さもなくば単数行の取得にて、なにかしらの行を取得する。
その行に含まれるユーザーIDを知る。
そのユーザーIDを使ってユーザーテーブルを参照してパスワードを得る。
こんな手順の処理が有り得るのか?
なんのためにそんな処理が必要?
518NAME IS NULL:2012/01/23(月) 04:27:29.58 ID:HdAvUfuX
>>516,517
すいません、確かにパスワードは2つ必要ですね。
まだそこまで考えていなくて曖昧になった部分がありました。

とりあえずとても簡潔に最低限の項目で
▼投稿テーブル
・ID(PK)
・ユーザーID(外部ID)
・ユーザー名
・メッセージ
▼ユーザーテーブル
・ID
・ユーザー名

としておきます。

書き込みは
(1) ユーザーがログインしている状態で投稿される場合
(2) ユーザーがログインしていないときに投稿される場合
の2パターンがあります。
(1)の場合のみ受け付けるならば、投稿テーブルにユーザー名は必要なく、
ユーザーIDだけ保持していれば、ユーザー名などの情報は
ユーザーテーブルから参照すればいいので簡単なのですが、
(2)の場合にも対応したい場合、ユーザーテーブルに情報が無い(非ログイン)ので
投稿テーブル自体にユーザー名を保持しなければいけません。

上記の実装だと、
・ログインしているかどうかによって、フィールドの必須かどうかが変わってくる
 →アプリケーション側の問題がDBの設計に影響してしまっている
のがスマートじゃないなと感じる点です。

(1), (2)の両パターンに対応した投稿テーブルの設計をアドバイスいただきたいです
519NAME IS NULL:2012/01/23(月) 05:07:06.58 ID:???
>>518
匿名投稿の場合、投稿者名の格納は投稿テーブルしかないのかを考える。

匿名投稿をメインにして基本的な構造を設計して、そこにログイン投稿能力を後付けするか、それとも逆か。それぞれの場合での設計をしてみる。

匿名投稿とログイン投稿のどちらが多くなるのか。
520NAME IS NULL:2012/01/23(月) 05:18:55.12 ID:???
たとえ匿名でも、同一人物が何度も無駄な連投をする荒らしになったら、当該人物による投稿をまとめて削除したりフラグ立てたりしなきゃならない。
だから、裏ではこっそり何らかの隠しアカウント処理を入れなきゃならない。

削除専用パスワードは表面的に個々のメッセージが個別に保有していることになるのだから、それはメッセージテーブル。

ログイン者投稿もしくは削除専用パスワードを未入力なら削除専用パスワードのフィールドはnull。

メッセージテーブルのユーザーIDには必ずIDが入る。正確には抽象ユーザーID。
抽象ユーザーIDをpkとする抽象ユーザーテーブルを見れば、それが実アカウントなのか仮アカウントなのかが分かり、実アカウントIDもしくは仮アカウントIDが分かる。
実アカウントテーブルはログインユーザー用。
仮アカウントテーブルは匿名ユーザー用。
匿名といえどもIP-addressやsession-idなどでできるだけ同一人物の集約をしておく。
521NAME IS NULL:2012/01/23(月) 05:44:34.33 ID:HdAvUfuX
>>520
> たとえ匿名でも、同一人物が何度も無駄な連投をする荒らしになったら、当該人物による投稿をまとめて削除したりフラグ立てたりしなきゃならない。
> だから、裏ではこっそり何らかの隠しアカウント処理を入れなきゃならない。
確かにそうですね

> メッセージテーブルのユーザーIDには必ずIDが入る。正確には抽象ユーザーID。
> 抽象ユーザーIDをpkとする抽象ユーザーテーブルを見れば、それが実アカウントなのか仮アカウントなのかが分かり、実アカウントIDもしくは仮アカウントIDが分かる。
> 実アカウントテーブルはログインユーザー用。
> 仮アカウントテーブルは匿名ユーザー用。
> 匿名といえどもIP-addressやsession-idなどでできるだけ同一人物の集約をしておく。
おおおおおおお!なるほど!!これはすごい!!
やべえ、これはいい。
抽象ユーザーIDをどう実装するかとかはまだつかめないけど、
かなりもやもやが解消されました。

>>519の指摘も含めまだ詳細が不明なので設計も悩んでしまうのかなぁと思いました
みなさんありがとうございます!
522NAME IS NULL:2012/01/26(木) 16:28:55.25 ID:KJ5k6qT1
ちょっと似た質問ですけど、
ユーザーに「プロフィール」という情報があった場合、
プロフィールテーブルを作るべきですかね?
それとも、ユーザーテーブルにフィールドを追加する方が良いですかね?

仕様は1ユーザー1プロフィールです。必要フィールドは20ぐらいあります。
523NAME IS NULL:2012/01/26(木) 19:07:45.86 ID:???
どっちでもいい。
524NAME IS NULL:2012/01/29(日) 15:10:14.36 ID:invohPqG
特定多数からINSERTがあるテーブルに
IPアドレスとリモートホストどっちを保存したらいいですか?
どっちも?合理的なのはどの方法だろう
525NAME IS NULL:2012/01/29(日) 15:43:27.54 ID:???
>>524
保存して、何に使うの?
526NAME IS NULL:2012/01/29(日) 15:50:36.49 ID:???
>>524
余裕があるなら両方保存しとけば?
527NAME IS NULL:2012/01/29(日) 16:20:09.30 ID:???
>>525
荒らしなどのために保存しておく必要があります
それで抽出して全削除したりします

>>526
そうしようと思ったんですが、
なにかなるほど、といった理由がほしくて質問してみました
528NAME IS NULL:2012/01/29(日) 17:03:40.33 ID:???
>>527
DB設計の話じゃなくなってきてるが・・・。

IP保存→文字数少ない。普通はこれだけで桶。

ホスト名保存→プロバイダなどでIPが変わる時にある程度範囲を絞るのに使いやすい。
 プロバイダ毎に割り当てIPのマップとかを調べてマッチング取ってもいいが、
 規模が大きくなると飛び飛びに拡張されてたりするからマンドクサイ。

漏れがやるとしたら・・・
IPにインデックス張って保存して、自動化部分ではそっちで処理
ホスト名は手動でやる時に like で抽出して使う方向

ってか、荒らしのIPわかってんならINSERT前に拒否すりゃインジャネ?
529NAME IS NULL:2012/01/29(日) 17:15:59.47 ID:???
>>528
>IPにインデックス張って保存して、自動化部分ではそっちで処理
>ホスト名は手動でやる時に like で抽出して使う方向
なるほど、こういう考えで行こうと思います
ありがとうございました
530NAME IS NULL:2012/01/29(日) 18:38:19.14 ID:???
あらし対策なら俺なら両方保存しとくが
アドレスだけ保存してても、アドレス変えて接続してきたとき対応できないからな
531NAME IS NULL:2012/01/29(日) 20:24:36.43 ID:???
DBにipv4アドレス保存するときは整数でな。
CIDRマスクも範囲も整数なら簡単。
10進数化文字列で保存したら死蔵だぞ。
532NAME IS NULL:2012/01/30(月) 05:51:06.96 ID:???
そうなん?16進のほうがわかりやすくね?
533NAME IS NULL:2012/01/30(月) 06:05:07.08 ID:???
>>532
何が分かりやすいんだよ
534NAME IS NULL:2012/01/30(月) 06:34:42.25 ID:???
整数のほうが判りやすいと思うほうがどうかしてる
535NAME IS NULL:2012/01/30(月) 07:04:45.34 ID:???
16進数を文字列として格納すると言っているのか
数値で格納して表示だけ16進数にすることを言っているのか
536NAME IS NULL:2012/01/30(月) 07:15:23.15 ID:???
>>534
整数型と文字列型を比べて、文字列型の方が分かりやすいといっている?
537NAME IS NULL:2012/01/30(月) 07:18:45.17 ID:???
内部表現が整数型をであれ文字配列型であれ、
16進数表記法が分かりやすいというのであれば
IN/OUTを16進数表記にしてしまえばいいんでないの?
そんなことは内部表現を整数にするかそれ以外にするかの判断材料にならないような。
538NAME IS NULL:2012/01/30(月) 07:19:46.84 ID:???
格納する時の構造と表示する時の書式を分けて考えられないだけでしょ
539NAME IS NULL:2012/01/30(月) 07:22:09.85 ID:???
>>532
ごめん。何を言いたいのかマジわかんねえ
540NAME IS NULL:2012/01/30(月) 07:24:25.01 ID:???
カラムの型宣言で16進数の指定できたっけ?
541NAME IS NULL:2012/01/30(月) 07:26:43.60 ID:???
remote_addr INT(8) HEX NOT NULL,
542NAME IS NULL:2012/01/30(月) 07:29:00.36 ID:???
>>534
16進数は整数の表記法の一部だから、整数の方が分かりにくいというなら、必然的に16進数も分かりにくいよな?ww
543NAME IS NULL:2012/01/30(月) 07:57:29.18 ID:???
>>542
整数ってのはINTとかLONGのことな
544NAME IS NULL:2012/01/30(月) 07:58:40.15 ID:???
表記法の問題だけ
545NAME IS NULL:2012/01/30(月) 08:05:49.67 ID:???
>>541
なにがいいたい?
546NAME IS NULL:2012/01/30(月) 08:11:33.69 ID:???
俺もip v4なら、intの値で保持して、必要なら表示用にストアドファンクション用意するかな
547NAME IS NULL:2012/01/30(月) 08:29:09.72 ID:???
>>546
それなら16進文字列で格納しても変わらなくね?
548NAME IS NULL:2012/01/30(月) 09:35:10.35 ID:???
>>532
16進数で保持するというのが全然分からないので、もう少し詳しく
549NAME IS NULL:2012/01/30(月) 09:37:25.75 ID:???
>>547
unsigned32bit整数値をわざわざhex文字列で格納するって最悪だろ
550NAME IS NULL:2012/01/30(月) 09:40:24.48 ID:???
>>547
16進数文字列だとCIDRマッチがややこしそう
551NAME IS NULL:2012/01/30(月) 09:43:11.17 ID:???
固定長整数値を入れるフィールドを文字列型にする変態はたまにいるね。
perlやphpでしか使わないから全然問題ないと言い張るの。
他の部署、他の会社でやってくれるならご自由に。
552NAME IS NULL:2012/01/30(月) 09:47:19.21 ID:???
>>550
まぁたしかにそれはあるかな
553NAME IS NULL:2012/01/30(月) 09:49:06.73 ID:???
>>551
勉強中の者として初歩的かもしれませんが、教えてください。
その固定長整数値のものが加減乗除する対象ではなければ文字列でも良いのではと思うのですが、ダメですか?
554NAME IS NULL:2012/01/30(月) 09:55:23.36 ID:???
>>553
何か得するの?
だいたいインデックスの順序狂うし
555NAME IS NULL:2012/01/30(月) 10:01:10.78 ID:???
>>554
>インデックスの順序狂うし

そうなんですか。thxです
556NAME IS NULL:2012/01/30(月) 10:13:47.57 ID:???
可変長なら順序狂うの確実だが、固定長なら狂わないかも。
いやどうだろう。大小は文字コード次第か。
557NAME IS NULL:2012/01/30(月) 10:28:35.66 ID:???
>>555
狂わないよ
558NAME IS NULL:2012/01/30(月) 11:18:10.30 ID:???
扱うデータが数なのか文字なのかで決める事でしょ
なぜわざわざ型を捻じ曲げたいのか
559NAME IS NULL:2012/01/30(月) 15:31:19.90 ID:???
たとえば文字列で'002'って格納されてるとする
=2で検索してもマッチしないぞ
格納するときに誰かが'02'や'空白空白2'で格納したらどうする?

加減乗除だけでなく、検索も表示もしないなら好きにすればいいが
そんな項目ほんとにDBに必要か
560NAME IS NULL:2012/01/30(月) 18:42:23.78 ID:???

IPアドレスなら文字でもいいでしょと言ってるんだろ
大規模ならintで保存。
中小規模ならcharでOK.要するにどっちでもいい。
561NAME IS NULL:2012/01/30(月) 19:29:58.04 ID:???
uint32の格納領域をchar配列で定義するようなやつはいつまでもぺーぺーですな。
562NAME IS NULL:2012/01/30(月) 19:34:11.17 ID:???
IPアドレスを入れるのに適した型が提供されているならそれを、そうじゃないなら整数型を。
563NAME IS NULL:2012/01/30(月) 19:40:58.27 ID:???
>>560
大規模でご法度な構造だとわかってるのに、なぜわざわざ中規模で採用するかなあ。
564NAME IS NULL:2012/01/30(月) 20:38:45.80 ID:???
IPAddrにインデックスをはるケースが思い浮かばないな
565NAME IS NULL:2012/01/30(月) 20:40:50.41 ID:???
IPアドレス格納時のデータ型
整数型の利点
・内部表現が一意
・データサイズの平均が最小
・出力時のフォーマッティングコストはそんなに高くない
・サブネットマスクなどの計算もビット演算で可能
整数型の欠点
・内部表現が見慣れない数字

固定長文字列の利点
・登録時に整数への変換不要
・内部表現が見慣れた表示のまま
固定長文字列の欠点
多すぎて書ききれない。
566NAME IS NULL:2012/01/30(月) 20:42:20.42 ID:???
おそらく文字列で問題無しと言ってる連中は、
ネットワーク、とくにIPアドレス体系の知識が無いのだと思われ
567NAME IS NULL:2012/01/30(月) 20:43:57.22 ID:???
あるよ
568NAME IS NULL:2012/01/30(月) 20:44:43.51 ID:???
>>564
思い浮かんだ後で手遅れにならんようにな
569NAME IS NULL:2012/01/30(月) 20:46:58.29 ID:???
>>568
そんな心配は規模が大きくなってからすればいい
スモールスタート時は心配いらん
570NAME IS NULL:2012/01/30(月) 21:01:21.95 ID:???
>>569
スモールスタートは痛いデータ構造を許容する理由にならないので。
むしろ追加予算確保が難しく、また規模増加が起きるとしたら急速で、
なおかつ規模急増中のサービス停止の損害が大きくなりがち。
黒字ラインを突破した途端に破綻して利用者に逃げられる設計なら最初から作らない方が得なんだよ。
571NAME IS NULL:2012/01/30(月) 21:05:27.06 ID:???
>>570
具体的に想定されるケースを挙げてみな?
ログ系ならNoSQLに対比しておけばいいわけだが
572NAME IS NULL:2012/01/30(月) 21:09:42.85 ID:???
>>571
君のところのサイトがどんなに穴だらけになっても他人は困らないし
同業他社はむしろ願ったり叶ったりだから
そのままの気持ちを大切にしていいよ。
573NAME IS NULL:2012/01/30(月) 21:11:37.27 ID:???
>>572
なんだ素人か
574NAME IS NULL:2012/01/30(月) 21:22:01.68 ID:???
用途によるんだろうけど、サブネットが同一か、とかあんまりやらんと思う
実際のところ、IPアドレスを格納してたとして、それを操作する機会ってあんまりないだろうな
たんに記録、表示がメインならドット表示の文字列でも問題はすくないかもしれん

ただ、文字列で格納するとしても、表記を正規化する必要はあると思う
192.168.1.1と192.168.001.001とは、文字列としては別物だからな
で、こんな正規化するぐらいなら俺なら数字で持っとくが
575NAME IS NULL:2012/01/30(月) 21:28:12.71 ID:???
サブネットが同一か、とかチェックするにしてもRDBでやるわけないだろ
仮に文字で格納するなら俺なら16進表記にするかな。
576NAME IS NULL:2012/01/30(月) 21:29:19.79 ID:???
ドットも保存するの?
577NAME IS NULL:2012/01/30(月) 22:30:37.50 ID:???
数値をわざわざ文字列化してDBに入れる奴もいるんだな。
勉強になった。
578NAME IS NULL:2012/01/30(月) 22:36:55.99 ID:???
>>569
大規模で通用しないDB設計はスモールスタートじゃなくてスモールエンド保証型設計なんだってさ
579NAME IS NULL:2012/01/30(月) 22:44:41.71 ID:???
>>578
この場合の大規模ってのはDWHとかのことね
580NAME IS NULL:2012/01/30(月) 22:45:41.03 ID:???
補足
DWHとODSを同じ設計でするとしたら素人認定だぞ
581NAME IS NULL:2012/01/30(月) 23:00:50.26 ID:???
いや、やっぱり感が直した。
スタースキーマにIPアドレスを保存すること自体が考えにくいな。
おおかた追記型でおkだな
582NAME IS NULL:2012/01/30(月) 23:00:52.14 ID:???
>>577
つか、>>524はそのアドレスがどういう形で得られるのかも書いてないんだよな。
たとえばこれがApacheのREMOTE_ADDRとかだったら、それでもそれを
わざわざ数値に変換したりするかねぇ。
583NAME IS NULL:2012/01/30(月) 23:28:25.62 ID:???
>>582
ドット付きをDBに入れるくらいなら変換だろう。
どうせ変換するなら
(1) ドット付き→数値
(2) ドット付き→数値→16進数文字列
どちらがいいか
584NAME IS NULL:2012/01/30(月) 23:31:48.08 ID:???
なんのために変換するの?
585NAME IS NULL:2012/01/30(月) 23:37:06.76 ID:???
>>584
むしろ何のために内部表現を文字列にしたいのやら
586NAME IS NULL:2012/01/30(月) 23:41:01.01 ID:???
>>582
特定多数って書いてあるからイントラだと仮定すると、
REMOTE_HOSTのほうがいいんでね?
587NAME IS NULL:2012/01/30(月) 23:57:19.53 ID:???
>>585
必要のない変換ならわざわざやらなくてもいいじゃん。
588NAME IS NULL:2012/01/31(火) 00:03:48.40 ID:???
>>587
わざわざというほどの労力でもあるまいし
589NAME IS NULL:2012/01/31(火) 00:07:00.69 ID:???
LDAP使ってるならREMOTE_HOSTで決まり
590NAME IS NULL:2012/01/31(火) 00:17:49.72 ID:???
parseエラーの対処とか考えたら、変換しなくて済むならそれに越したことはないな。
591NAME IS NULL:2012/01/31(火) 00:25:55.50 ID:???
>>590
お前はパースエラーになりかねないデータを、文字列型だから何でも黙って食ってくれるからといって、
右から左に渡すつもりか?
DBの内部表現が何であれ、アプリがやるべき確認は変わらんだろ。
592NAME IS NULL:2012/01/31(火) 00:28:33.87 ID:???
つかLDAP認証済みならそもそも確認する必要なくね?
593NAME IS NULL:2012/01/31(火) 00:35:15.48 ID:???
>>591
だからそれparseする必要あんの?
それ確認する前に決め付けちゃってない?
594NAME IS NULL:2012/01/31(火) 00:37:57.37 ID:???
>>593
確認するってことは既にparseしてんだろ
595NAME IS NULL:2012/01/31(火) 00:45:22.53 ID:???
だめだこりゃ
596NAME IS NULL:2012/01/31(火) 00:57:56.57 ID:???
変換しない=チェックもしない=parseもしない って事?
HTTPDが返してくるデータだから全面的に信頼してるって事?
ゴミが来てもそのまま入れるって事?

もうプログラミングやめろ。
597NAME IS NULL:2012/01/31(火) 01:00:02.71 ID:???
そう。しなくてOK.
イントラでLDAP認証ずみならな
598NAME IS NULL:2012/01/31(火) 01:17:09.21 ID:???
だから、何を信頼できて何が「ゴミ」なのか、思い込みで設計しないでくれよ。
599NAME IS NULL:2012/01/31(火) 01:32:26.77 ID:???
チェックしなくてokなくらい信頼してるならパースエラーなんか対処しなくていいだろうに
600NAME IS NULL:2012/01/31(火) 01:36:02.53 ID:???
Apacheが渡すREMOTE_ADDRがぶっ壊れてないことをLDAPに頼る設計?
意味わかんね
601NAME IS NULL:2012/01/31(火) 01:51:09.20 ID:???
やはりここはDB板であって、ネットワークやプログラミングに関する
知識の無いヤシが多いなw(もちろん分かってる一部のヤシもいるけど....)
というか、ここは「DB設計を語るスレ」だよな?


602NAME IS NULL:2012/01/31(火) 01:56:24.80 ID:???
>>601
もし君が自分の考えを正しいと思い込んでるなら、ただそれだけで低スキル。
603NAME IS NULL:2012/01/31(火) 02:14:30.42 ID:???
>>600
REMOTE_HOSTだっつてんだろ
DynamicIPだったら信頼できねぇだろうが
頭固いの?
604NAME IS NULL:2012/01/31(火) 02:19:36.53 ID:???
>>603
訂正:信頼できない→クライアントを特定できない
605NAME IS NULL:2012/01/31(火) 02:24:10.39 ID:???
>>602
いや、本当だよ。
自分の領域の外が見えてない石頭のガラパゴス恐竜のスクツだよ。
ちみこそシステムアーキテクチャの勉強でもしたまえ。
606NAME IS NULL:2012/01/31(火) 02:31:06.34 ID:???
>>603
DynamicIPを信用しないのにREMOTE_HOST信用するって…
607NAME IS NULL:2012/01/31(火) 02:34:27.99 ID:???
>>606
だからイントラでLDAPの話だってばwww
LDAPでぐぐれ
608NAME IS NULL:2012/01/31(火) 02:41:03.88 ID:???
>>607
LAN内は物理攻撃が容易で、アドレス信用できないときはREMOTE_HOSTはさらに信用できない
609NAME IS NULL:2012/01/31(火) 02:43:11.05 ID:???
なんでipv4アドレス保存を必死に嫌がるのだ?
REMOTE_HOST保存することはipv4アドレス保存しないことの理由になってないぞ?
610NAME IS NULL:2012/01/31(火) 02:44:53.29 ID:???
ならMACアドレス認証とユーザー認証もつけろ
もしくはクライアントにAdmin権限を与えるな。
イントラだから当然FireWallも設置しろ。
611NAME IS NULL:2012/01/31(火) 02:46:20.88 ID:???
612NAME IS NULL:2012/01/31(火) 02:47:24.99 ID:???
>>610
訂正 ユーザー認証は要らんな。すまん
613NAME IS NULL:2012/01/31(火) 02:50:42.85 ID:???
LDAPでミスったら被害の範囲を広げるように設計されたwebシステムですかね
REMOTE_HOST原理主義こわい
614NAME IS NULL:2012/01/31(火) 02:53:12.86 ID:???
突然認証の話を創作してる糞電波は誰だよ。
認証関係ないだろうが。
615NAME IS NULL:2012/01/31(火) 02:54:52.08 ID:???
>>613
ミスったら接続できねぇだろうが
そもそもLAN内をどれだけ強固にしたいんだ?
616NAME IS NULL:2012/01/31(火) 02:55:19.61 ID:???
>>614
スレを読めよ
617NAME IS NULL:2012/01/31(火) 02:56:24.65 ID:???
>>615
それ、REMOTE_ADDRをどのような内部表現でDBに保存するかの問題とどんな関係があるんですか?
618NAME IS NULL:2012/01/31(火) 02:57:55.98 ID:???
619NAME IS NULL:2012/01/31(火) 02:59:56.50 ID:???
REMOTE_HOSTポイゾニングに弱くね?
620NAME IS NULL:2012/01/31(火) 03:02:18.90 ID:???
MOD_LDAPなりIISなりつかえば桶
621NAME IS NULL:2012/01/31(火) 03:03:02.66 ID:???
>>607
REMOTE_HOSTを作るresolverの仕事をLDAPにやらせるということ?
622NAME IS NULL:2012/01/31(火) 03:03:43.82 ID:???
yes
623NAME IS NULL:2012/01/31(火) 03:10:47.10 ID:???
>>615
> ミスったら接続できねぇだろうが

LDAPミスったら接続できない?
それ質問者の前提を勝手に書き換えて、俺様環境を前提にしてないか?
624NAME IS NULL:2012/01/31(火) 03:13:18.26 ID:???
>>590あたりから異論多発してるっぽいが、それぞれの意見が曖昧で掴みにくい。
ちと整理しとくれよ。
625NAME IS NULL:2012/01/31(火) 03:15:06.32 ID:???
>>623
だーかーらー
固定IPを割り振るとかしてもいいんだよ?
それにレイヤ2で認証してもいいんだよ?
フールプルーフの方法はいくらでもあるだろ
626NAME IS NULL:2012/01/31(火) 03:16:37.25 ID:???
大きく割れ出したのは>>582からだろ
627NAME IS NULL:2012/01/31(火) 03:20:43.47 ID:???
>>582
> たとえばこれがApacheのREMOTE_ADDRとかだったら、それでもそれを
> わざわざ数値に変換したりするかねぇ。

大半はこの数値に変換する是非について語ってるようだが、
そこにLDAPとか認証とかの話が唐突に繋がってくる脈絡が読めん。
628NAME IS NULL:2012/01/31(火) 03:21:44.00 ID:???
629NAME IS NULL:2012/01/31(火) 03:26:13.84 ID:???
>>628
きっかけはそれっぽいが、それを契機に>>582より新たな議題が提起されて
そこからは変換是非の議論がforkしてるっぽいな。
そこからの流れにLDAPが追加される繋がりがワケワカメ。
630NAME IS NULL:2012/01/31(火) 03:30:58.95 ID:???
変換是非の話の流れ
>>524
>>586
>>587
>>589

631NAME IS NULL:2012/01/31(火) 03:32:40.60 ID:???
そもそも質問者はLDAPとか一切言ってないんだが・・・。
どうしてLDAPとかイントラの話になってるんだ?
632NAME IS NULL:2012/01/31(火) 03:39:23.21 ID:???
>>630
変換という言葉は582までだと>>565>>582しかなくて、
共にIPv4 addressの数値変換のことを意味している
633NAME IS NULL:2012/01/31(火) 03:41:55.65 ID:???
>>631
仮定だよ仮定。
質問者は
「IPアドレスとホスト名のどっちを格納するのがいいか?」
と質問したのに対して、
きっとアクセスしてきたホストの履歴を残ししたいんじゃね?(それ以外に用途が思い浮かばない。)
(不特定多数ではなく)"特定多数"っていってんだからイントラじゃね?
多数ならLDAPつかってるかもしれないね。
LDAPつかってるなら(使ってなくても)
動的IP使ってる場合もあるから、
REMOTE_HOSTを格納するほうがいいでしょう。

ということでつ。
634NAME IS NULL:2012/01/31(火) 03:42:55.02 ID:???
>>632
ごめん、意味を取り違えた。
変換の話からforkしたくだり。
635NAME IS NULL:2012/01/31(火) 03:55:10.98 ID:???
変換議論まとめてみた。雑に圧縮してごめん。

>>582 REMOTE_ADDRとかだったらわざわざ数値に変換するかね
>>583 ドット付きをDBに入れるくらいなら変換
>>584 何のために変換する?
>>585 何のために内部表現を文字列にしたい?
>>587 必要のない変換ならわざわざやらなくていい
>>588 わざわざというほどの労力でもあるまい
>>590 parseエラー対処を考えたら、変換しなくて済むならそれに越したことはない
>>591 parseエラーになりかねないデータを...渡すつもり?DBの内部表現が何であれアプリがやるべき確認は変わらない
>>593 parseする必要あるのか?確認する前に決めつけていないか?
>>594 確認するということは既にparseしている
>>596 変換しない=チェックもしない=parseもしないということ?
>>597 そう。しなくてOK。イントラでLDAP認証済みならば

この瞬間に数値変換議論にLDAPや認証の話が繋がったみたい。
636NAME IS NULL:2012/01/31(火) 04:01:28.66 ID:???
認証があればREMOTE_ADDRのparseエラーは起きないからチェック不要?
apacheの仕組みは良くわからんな
637NAME IS NULL:2012/01/31(火) 04:21:41.93 ID:???
LDAP認証がチェック終わらせてるんだから、後からチェックしなくていい。
638NAME IS NULL:2012/01/31(火) 05:34:25.21 ID:???
IDでないから話がわけわからん

数値保存派と文字列保存派の話だったのにLDAPだったらとかは関係なくね?
intで保存してもipアドレスであることは保証されないから
16進数で桁数指定しても、プログラム上でのチェックは不要ってことにはならんでしょ
だから、逆にLDAPだからって文字列もノーチェックでDBにいれていいかというと大いに疑問がある

そうすると、ipアドレスの型チェックはプログラム上で正規表現でチェックするのが一番融通がきくし分かりやすいし、アドレスは文字列としてプログラム上で使うことが多いから、DBにも文字列で保存した方が自然な気がする
DB設計的なメリデメって数値型でカラム切っておくとgroup byできるくらい?
ドットをDBにいれたくないってどういうデメリットか分からん
639NAME IS NULL:2012/01/31(火) 06:30:24.10 ID:???
> ipアドレスの型チェックはプログラム上で正規表現でチェックするのが一番融通がきくし分かりやすいし
バイナリを取り扱った経験がない人間でも出来るという事か
まともじゃないプログラマが混ざっているアレな現場ならありかもな
640NAME IS NULL:2012/01/31(火) 08:53:14.10 ID:???
バイナリを取り扱った経験がないまともじゃないプログラマが
正規表現の使い方を知ってるとも思えんなぁ
641NAME IS NULL:2012/01/31(火) 09:01:47.48 ID:???
用途がはっきりわからないにあれこれ外野で議論してても意味なくね?
642NAME IS NULL:2012/01/31(火) 09:25:11.51 ID:???
自分の好きに保存すればいいじゃん
643NAME IS NULL:2012/01/31(火) 09:36:35.61 ID:???
v6も数値でいいの?
644NAME IS NULL:2012/01/31(火) 09:38:45.82 ID:???
処理系によるんじゃね
645NAME IS NULL:2012/01/31(火) 10:07:28.14 ID:???
とりあえず、ipもホストもデータで持ってれば後からなんとでもなる。
646NAME IS NULL:2012/01/31(火) 10:18:53.99 ID:???
IPはどっちでもいいんでね?
俺は生でSQL叩く時に楽だし大小比較云々も無いという理由で文字列だけどね(ホストも文字列格納だしその辺と合わせて)
まぁデータ的には数値格納の方がスマートだけどね
ぶっちゃけもうこの辺はポリシー次第
647528=565=631:2012/01/31(火) 15:32:02.36 ID:???
リモホも保存する事には反対してない。
IPは数値に変換して保存には賛成。

数値に変換して格納する場合
・検索対象も数値に変換する(手入力も含めて考えると)
 → 192.168.1.1も、192.168.__1.__1( _ が半角スペース)も、同じ数値に変換される
・変換処理自体をストアードで書けば検索用のSQLも単純で済む
・INSERT時に変換1個1回、検索時に変換1個1回で済む
・データは小さくて済む

文字列で格納する場合
・検索時の入力規則を決めて処理系でチェックするかストアードで同じ表記になるように変換する
・仮に入力、格納データを数値に変換して検索する場合、検索毎に全件件数個+検索対象1個1回の変換が必要

IPアドレスは元々数値のモノ。
それを人間にわかりやすい表記にしたのが、192.168.x.x形式なんだから、
元々の数値で保存するのが素直なんジャマイカ?
648NAME IS NULL:2012/01/31(火) 16:26:10.35 ID:???
>>646
楽にSQL読み書きしたけりゃ、 INET_ATONとか関数使えばいいじゃん
649NAME IS NULL:2012/01/31(火) 16:40:02.05 ID:???
>>647
文字列で格納する場合だけど、

>・仮に入力、格納データを数値に変換して検索する場合、検索毎に全件件数個+検索対象1個1回の変換が必要

これはちがうよ。(1個1回という表現の1個が何を指してるのかわからんのだが)
NSERT時に変換1回、検索時に変換1回で済む
650NAME IS NULL:2012/01/31(火) 16:50:23.17 ID:???
おまえらどれだけ巨大なDB作ろうとしているの?
651NAME IS NULL:2012/01/31(火) 17:00:25.59 ID:???
最初の質問者、もう全然出てこねぇし w
652NAME IS NULL:2012/01/31(火) 17:07:58.21 ID:???
そろそろこの話題おわりでいいんじゃね
653NAME IS NULL:2012/01/31(火) 17:49:08.95 ID:???
>>651
いや、いますよ
654NAME IS NULL:2012/01/31(火) 17:50:43.20 ID:???
>>597
LDAPだとどうしてチェックしなくていいんですか?
655NAME IS NULL:2012/01/31(火) 18:11:31.91 ID:???
656NAME IS NULL:2012/01/31(火) 18:14:05.47 ID:???
>>653
なんだお、いたのかよ
657NAME IS NULL:2012/01/31(火) 18:39:58.59 ID:???
>>655
ちょっと詳しく説明しよか。

組織階層(会社、部門、ユーザー、ホスト等)を一元的に管理できる
Directoryサーバーという物があってだな
そのプロトコルをLDAPという。
一般的にLDAPサーバーといえばDirectroyサーバーのことを差す。
認証方式にはKerberos認証などといったプロコトルを使う。
(他のプロトコルもあると思うがKerberosが多いと思う)

クライアントコンピュータはLDAPプロトコルを喋って、
ディレクトリサーバにログインする。
すると、WEBサーバー等へのアクセスも許可する、ということができる。(シングルサインオン)

LDAPサーバーはネームサーバーも兼ねているので、
マシン名もユーザー名もわかっている。
つまりそのホストは信頼されている、ということ。
658NAME IS NULL:2012/01/31(火) 18:41:29.87 ID:???
そもそも元質問はリモホとアドレスどっち保存しますか?で
IPアドレスの格納形式について聞いてたんじゃないからな
659NAME IS NULL:2012/01/31(火) 18:41:35.39 ID:???
まさに宗教だなw
こんなんどっちでもいだろw
660NAME IS NULL:2012/01/31(火) 18:44:34.10 ID:???
追記すると、WEBサーバーやアプリサーバーもディレクトリサーバーの管理下に入る。
(入れないことも出来る)
配下にしない場合は、シングルサインオンに制限が加わる。
(3層構造で権限の移譲ができないなど)
661NAME IS NULL:2012/01/31(火) 18:55:29.83 ID:???
>>653
>いや、いますよ


だったら、どういう環境でここはどうこうでって、みんなに説明しろよ
何が
>いや、いますよ
だ w
662NAME IS NULL:2012/01/31(火) 19:46:48.99 ID:???
>>655
LDAPの有無でREMOTE_ADDRのフォーマットの信頼性が上がる?
LDAP詳しくないんでぴんとこないが。
663NAME IS NULL:2012/01/31(火) 20:39:37.13 ID:???
荒らしと言ってる時点でクローズな環境じゃないだろjk
664NAME IS NULL:2012/01/31(火) 21:33:38.15 ID:???
>>662
REMOTE_ADDRフォーマットの信頼性?
フォーマットは崩れるわけねえだろjk
665NAME IS NULL:2012/01/31(火) 23:31:34.02 ID:???
元の要望ではべつにどっちでもいいでしょ。
666NAME IS NULL:2012/02/01(水) 00:01:16.79 ID:???
>>635
> >>596 変換しない=チェックもしない=parseもしないということ?
> >>597 そう。しなくてOK。イントラでLDAP認証済みならば

REMOTE_ADDRのparseやチェックの処理がLDAPを使うと不要になる理由は何なの?
667NAME IS NULL:2012/02/01(水) 00:05:54.52 ID:???
>>601
とかなんとか言って全員を低脳扱いしてたお前は
聞き齧ったLDAPという用語を披露してみたかっただけのシッタカだったと?
668NAME IS NULL:2012/02/01(水) 01:06:15.34 ID:???
よくTIMESTAMP型のupdatedなんていうカラムを見かけますが
これって必要なんですか?
更新順にソートしたいケースとかもあるんでしょうけど、
慣習的につけてるような気がする人が多い気がします。
669NAME IS NULL:2012/02/01(水) 01:59:05.60 ID:???
>>668
いつ変更されたかパッと見でわかるじゃん。
むしろシステム運用してると無いと困ると思うけど・・・
DBMSによってはレコード情報でとれるのもあったきがするけども

アプリ側で登録ロジック対応してないと無意味だけど
前触ったシステムでは更新トリガーでセットしてたな...
670566,601:2012/02/01(水) 02:49:01.27 ID:???
>>667
何を言っているんだ、お前はw
自分はLDAPの知識を自慢げに披露した>>657では無いし、
それどころか今回の話題とLDAPは無関係であり、
却って正しい議論の道筋を混乱させただけ、と断言する

繰り返すけど、ここはDB板にある「DB設計を語るスレ」だよな?
DB設計の本質とは、断片的な顧客の要望(>>524,527)から
適切なデータモデルを導く過程、それを忘れてはいまいか?
まぁ、いつもの業務アプリ/DB系とは異質な領域であり、
皆不慣れであるが故にいくらかの混乱はしかたないと思うがな
671NAME IS NULL:2012/02/01(水) 03:00:02.80 ID:???
>>668
よくWindowsでもLinuxでもファイルには更新時間なんていう属性を見かけますが、
これって必要なんですか?
更新順にソートしたいケースとかもあるんでしょうけど(たとえばmake)、
大半のファイル処理では更新時間なんて必要の無い情報に思えます
672NAME IS NULL:2012/02/01(水) 03:33:12.10 ID:???
>>668
必要があるか無いかはそのテーブルの使われ方によるから何ともいえん
つかお前はよく見るのかもしれんが、俺はめったに見ないぞ、そんなもん
673NAME IS NULL:2012/02/01(水) 03:48:53.96 ID:???
俺はよく見るよ
>>668が思っているように、慣習的につけただろって感じのもよく見るよ
さらに、更新漏れがあるといやだってなって全テーブルに>>669で書いてるようなトリガつけてるのも見たことあるよ
このテーブルにはいらないよねって現場のみんなが認識してるけど、統一感を保つためだけにつけてることも

ちなみにそういうところには、作成日時と更新日時と削除フラグがセットであったりする
674NAME IS NULL:2012/02/01(水) 08:41:43.53 ID:???
>>668
RDBMS以外のキャッシュにデータ丸投げしてるときに、デーモンがupdatedの最大値の変化を検知してキャッシュ更新処理に移るということもあり。
FSのタイムスタンプみたいな存在でもあるけどね。トラブル時にはどんな情報も欲しい。
675NAME IS NULL:2012/02/01(水) 10:45:05.73 ID:???
>>668
同時並行更新処理のときには使ってるよ。
一回SELECTしたデータをUPDATEするときに再度WITH UPDLOCKで取ってきて
こいつが更新されてなければ自分で更新、って感じ。
たぶん赤間本の影響でここ10年来時々見る。
676NAME IS NULL:2012/02/01(水) 12:28:37.70 ID:???
>>670
おい別に自慢してねぇぞ。
効かれたから説明しただけだ
しばらくレスできんぞ
677NAME IS NULL:2012/02/01(水) 13:17:31.78 ID:???
赤間本の影響を受けたならSQLServerの予感がするんだけど、
もしそうならtimestampじゃなくて本名のrowversionに移行してあげてほしいな
678NAME IS NULL:2012/02/01(水) 21:40:42.28 ID:???
>>676
文句があるなら、>>667に言えよ
>>667によれば、お前さん(>>657)は
「聞き齧ったLDAPという用語を披露してみたかっただけのシッタカ」
らしいぞwww

そそっかしい>>667>>657だと勘違いされるのは、
自分としては、正直言って大迷惑だよ
679NAME IS NULL:2012/02/01(水) 21:45:33.55 ID:???
安価多すぎワロタ
680NAME IS NULL:2012/02/01(水) 21:52:39.19 ID:???
わけわかんねえ。
とりあえずLDAPを言い出したやつが名前にLDAP入れれば?ww
681NAME IS NULL:2012/02/01(水) 21:56:07.66 ID:???
いや、そこは明らかにする必要ないだろ
もうこの話は終わりでいいよ
682NAME IS NULL:2012/02/01(水) 21:59:33.02 ID:???
>>673
甘いな。作成者idと更新者idも付いてるわ。
683NAME IS NULL:2012/02/01(水) 22:02:10.71 ID:LSgDEjoU
次の方どうぞ
684NAME IS NULL:2012/02/01(水) 22:06:23.63 ID:???
>>682
ああそうだ、ごめんわすれてた。
都合5カラム強制付加しびれるよねw
685NAME IS NULL:2012/02/02(木) 03:25:34.98 ID:???
>>681
せっかく勉強になる話だったからもっと聞きたいんですが。こんなので止まったら残念です。
LDAPとの関連の部分が良くわからなかったので詳しい人の説明を聞きたいよ。
686NAME IS NULL:2012/02/02(木) 07:28:19.01 ID:???
>>666
REMOTE_ADDRはIPプロトコルヘッダの中に入っている送信元アドレスだから。
つまりHTTPとは無関係だから、ホストが信頼されていれば、REMOTE_ADDRも信頼できる。
LDAP環境ならREMOTE_HOSTも一応信頼できるが、完全に信頼するにはIP逆引きが必要かもしれない。(LDAP_DNSで逆引きするよう設定していても)。
まあどこまで信頼するかだが。
687NAME IS NULL:2012/02/02(木) 07:52:13.46 ID:???
Apacheの話なら、REMOTE_HOSTはREMOTE_ADDRをApache自身が
逆引きした結果だろうが。
688NAME IS NULL:2012/02/02(木) 08:01:15.81 ID:???
それはどこから取得していると思う?
689NAME IS NULL:2012/02/02(木) 08:04:50.69 ID:???
すまん誤爆
690NAME IS NULL:2012/02/02(木) 08:13:04.97 ID:l/wRkoHb
>>685
ここはおまえの勉強jのためのスレか?
691NAME IS NULL:2012/02/02(木) 09:16:42.99 ID:???
勝手にapacheチューニングしてろよ
692NAME IS NULL:2012/02/02(木) 10:13:26.90 ID:???
>>686
LDAPならREMOTE_HOSTが信用できて、DNSならREMOTE_HOSTが信用できない?
それはなぜ?
693NAME IS NULL:2012/02/02(木) 10:24:08.13 ID:???
DNSのサーバすら信用できない状況ならLDAPのサーバも信用できるわけないWWW
694NAME IS NULL:2012/02/02(木) 10:34:47.76 ID:???
LDAPのDB設計の話でもするんか?
695NAME IS NULL:2012/02/02(木) 11:31:02.39 ID:???
DB設計の際、IPを整数にするか文字列にするかの判断材料に
LDAPが関わってくるという説があるってことだろ
696NAME IS NULL:2012/02/02(木) 13:01:33.17 ID:???
>>524,527が元だよね。

特定多数の(LDAPで信頼されているかもしれない)ホストのうち、
いずれかが荒らし行為をする可能性があるから、IPアドレスなりホストなりを残したいと。

部署ごとにサブネット分けてるかもしれないし、統計出すことも考えれば、
整数で入れておいたほうがいろいろ楽だろ。
697NAME IS NULL:2012/02/02(木) 13:20:29.83 ID:???
で、整数で入れる方が合理的だが、その場合REMOTE_ADDRをparseしなければならず、parseエラーにも対応しなければならない。
一方文字列で入れる場合、parseやチェックを整数と同様にやるべきか、それとも省略できるかについて意見が別れている。
ただし名前解決にLDAPを使っている場合はチェックしなくてもよい。
698NAME IS NULL:2012/02/02(木) 13:45:33.17 ID:???
オチワロタ
699NAME IS NULL:2012/02/02(木) 19:36:48.06 ID:???
>>697
LDAPを使っていようがいまいがREMOTE_HOSTのパースエラーは
対応する必要ないよ。
WEBサーバーのセッション変数REMOTE_HOSTは
[0-9]{1-3}¥.[0-9]{1-3}¥.[0-9]{1-3}¥.[0-9]{1-3}
の形式しかありえない。
700NAME IS NULL:2012/02/02(木) 19:46:31.11 ID:???
>>692
DNSが信頼できないということではない。
HTTPクライアントが渡すHOSTが環境変数REMOTE_HOSTに渡ってきたら、
逆引きしないとまずいかなーと思っただけ。
>>687
ということだから、
REMOTE_HOSTも信頼できるということになるな。

701NAME IS NULL:2012/02/02(木) 20:05:22.71 ID:???
>>697
LDAPを使っていようがいまいがREMOTE_ADDRのパースエラーは
対応する必要ないよ。
WEBサーバーのセッション変数REMOTE_ADDRは
[0-9]{1-3}¥.[0-9]{1-3}¥.[0-9]{1-3}¥.[0-9]{1-3}
の形式しかありえない。
702NAME IS NULL:2012/02/02(木) 23:59:37.36 ID:???
2回も書いたのに、ネットワークアドレスが入ることがありうると曲解されそうですよそれ
703NAME IS NULL:2012/02/03(金) 01:54:56.59 ID:???
>>699
REMOTE_HOSTのパースエラーなんて話は今まで出てきてないずらべよ
704NAME IS NULL:2012/02/03(金) 02:04:42.00 ID:???
だいたいアドレスのパースエラーなんてアプリではじくべき話で
DBに格納するのは正規化されたアドレスだけにしとけって話じゃないのか
DBには正規化された形式で格納するべきで、DB設計の話じゃないだろうと思うんだが

もちろん必要ならIPアドレスとしてパースエラーが起こるようなデータを保持するって設計もありだが
それを勧めてるようなやつはいなさそうだし
705NAME IS NULL:2012/02/03(金) 07:22:21.12 ID:???
それが要件ならそれに従うだけ。
それを確認しないうちから、あるいは勝手に決め付けて、議論してもはじまらない。
706NAME IS NULL:2012/02/03(金) 08:18:35.56 ID:???
>>703
うん。それ誤爆。
あぼんできないのか。
707NAME IS NULL:2012/02/03(金) 09:37:40.59 ID:???
>>705
どちらかというと格納形式への要件を定める立場なんだがな
708NAME IS NULL:2012/02/03(金) 11:37:44.78 ID:uIdP5OgD
質問者はここを眺めてるだけで方向性を修正しようともしない

こんなのいくら議論してったって無駄
709NAME IS NULL:2012/02/03(金) 19:24:27.56 ID:???
いやだから、元質問と全然関係ない話題でもりあがってるんだが
710NAME IS NULL:2012/02/03(金) 20:05:56.02 ID:???
>>707
よそさまのシステムの要件定義もできちゃう立場なんですねwww
711NAME IS NULL:2012/02/03(金) 20:42:23.05 ID:???
>>704
アドレスのフォーマットに変なのが入ってくる確率なんて
99.99999999999%ないんじゃね。
ただひとつだけあるとしたら、WEBサーバー自身がバグってるとき。
712NAME IS NULL:2012/02/03(金) 20:49:09.85 ID:???
>>711
もしバグってたらもっと高頻度で壊れるのでは?
713NAME IS NULL:2012/02/03(金) 20:50:52.07 ID:???
>>706
ローカルあぼーんだった…
あぼーんしたことねぇからやり方わかんね
714NAME IS NULL:2012/02/03(金) 20:52:49.80 ID:???
>>712
そうだね。
でもそれはアプリのバグじゃなくてサーバーのバグだから、
考慮不要じゃね?
715NAME IS NULL:2012/02/03(金) 22:40:00.59 ID:???
>>711
そういう変な数字をでっち上げる癖は捨てた方がいいのかもしれん
716NAME IS NULL:2012/02/03(金) 23:17:09.19 ID:???
イレブンナイン
717NAME IS NULL:2012/02/04(土) 01:38:41.81 ID:???
しかし
>>711が測定ミスする確率は10%以上あるんだって
718NAME IS NULL:2012/02/04(土) 12:46:10.47 ID:???
今日は静かだな。よし、今日のお題ー

【(バグがあるかないかわからない)サーバープロダクトのパースエラーは考慮する?しない?】

だ。おまいらどうよ
719NAME IS NULL:2012/02/04(土) 13:02:18.61 ID:???
>>718
意味が分からない
720NAME IS NULL:2012/02/04(土) 14:53:35.38 ID:???
それが致命的かどうかによるでしょ
721NAME IS NULL:2012/02/04(土) 15:08:10.57 ID:???
考慮はするでしょ。
対応するコードを書くかどうかは別だけど。
722NAME IS NULL:2012/02/04(土) 19:15:44.58 ID:???
データベースは外部の情報の正確性とかそういうのに依存しない設計が望ましいと思うから、チェックする(・∀・)スンスンスーン♪
723NAME IS NULL:2012/02/04(土) 19:38:18.48 ID:???
チェックするのはDBの仕事じゃないだろう

チェックされた正規の形式でしか格納できないようにするか、
チェックされていない不正な形式のデータでも格納できるようにするか
が、DB設計で考慮するべきことだ
つまり格納するデータの要件としてチェック済み(とみなせる)か否かだけの話
724NAME IS NULL:2012/02/04(土) 20:50:45.88 ID:???
DBMSのチェック制約って使う?使わない?
俺が経験したプロジェクトだと圧倒的にしないとこが多い。

ERPとかだと参照整合性制約すら使ってなくて、
アプリ(ERP)でチェックするしな。

ちなみに俺がスクラッチするなら使える制約は基本的に使う。
RDBに整合性が担保されないデータが入ってきたら後々面倒だから。
725NAME IS NULL:2012/02/04(土) 21:47:43.74 ID:???
>>724
最近はDBでの整合性保障を減らしてる。
KVSとか他のストレージと組み合わせたときの統合的な整合性保障を考えると
ビジネスモデルレイヤーでの抽象的な保障を狙って設計した方が後々の破綻を防げる。
726NAME IS NULL:2012/02/05(日) 22:41:58.87 ID:???
サロゲートキー推進派に質問なのだが、
有効期間を持つマスタにサロゲートキーを付ける場合、
トランザクションを打つ段階で、有効期間が正しくメンテされているとは
限らないとすると対応できる?
たとえば後から単価が決まる(20日〜月末の単価は10%オフみたいな)場合、
マスタを修正した時点で、トランに格納されている20日〜月末のマスタIDを
裏から一括で変更しないといけないんだが…
727NAME IS NULL:2012/02/05(日) 23:41:04.09 ID:???
サロゲートキーを自然キーに置き換えると答えが変わる話には思えないんだが
728NAME IS NULL:2012/02/06(月) 02:41:24.09 ID:???
その日の売上(トラン)と関係ないかも知れないマスタを
トラン(売上)に入れておくこと自体がおかしい。

サロゲートキーはオブジェクト指向みたいなもんだ。オブジェクトは
主キーがあろうがなかろうが、メモリ上の番地が違う以上一意に識別できる。
オブジェクトはどのオブジェクトを呼びに行けばいいのか生成時に知っている。

DBでそれをやろうとするなら、レコード生成時に参照先を固定できないとな。
たとえば単価の有効期間を持つマスタから日別単価マスタを作っておくとか。
729NAME IS NULL:2012/02/06(月) 02:59:35.81 ID:???
サロゲを上手く扱えるモデリングツールがねーよ。
皆の衆はどうしてる?
730NAME IS NULL:2012/02/06(月) 05:14:43.71 ID:???
お前が上手く扱えてないだけだろう・・・
731NAME IS NULL:2012/02/06(月) 06:43:44.40 ID:???
Type A)
論理ERDはNatulalKeyで設計して 、物理ERDでサロゲに落とす。
Type B)
・論理ERDの段階からサロゲ、NK、その他の3区画にできる。

俺はAしか見たこと無いが、本当はBにしたい。
Aも使い物にならん。
732NAME IS NULL:2012/02/06(月) 06:45:12.48 ID:???
Aでもいいけど、NKがそのAKとしてまま残る事が条件だな。
733NAME IS NULL:2012/02/06(月) 12:09:17.67 ID:???
ここってオラクルのスレでいいの?
734NAME IS NULL:2012/02/06(月) 12:12:57.98 ID:???
オラクルのことはオラクルスレに行ってくれよ
735NAME IS NULL:2012/02/06(月) 12:35:50.50 ID:???
はい
736NAME IS NULL:2012/02/06(月) 13:33:32.21 ID:???
モデリングツールって使ったことがないんだが、おまいらオヌヌメのを教えてください。
737NAME IS NULL:2012/02/06(月) 18:37:33.25 ID:???
システム規模が小さい場合、データベース設計を頑張れば頑張るほど後悔する。
738NAME IS NULL:2012/02/06(月) 19:16:51.08 ID:???
後から変更が出るのは規模の大小には関係ない。
最初から完璧なDB設計をする方が無駄だと思う。
739NAME IS NULL:2012/02/06(月) 22:02:23.31 ID:???
>>728
メモリ上の番地が業務的に重要なわけじゃないんだよ。
例えるなら、住んでる場所(アドレス)ではなく住んでる人(コード)が
重要なわけで、住所が変わる前でも人は存在するから、
売り上げは上がるけど、請求するタイミングでは引っ越してるから、
古い住所に請求書送ってもダメってことだよ。
740NAME IS NULL:2012/02/06(月) 22:20:15.73 ID:???
>>739
それもそうだし、売り上げ発生時点の情報がほしいこともあるよねってことじゃ
741NAME IS NULL:2012/02/06(月) 22:24:10.73 ID:???
>>739
売上は売上、請求は請求で日付が違っても別のイベントなんだから
それぞれその時点で追えばいい。遡及するわけではない。
ある時点の住所が後から決まったりしない。

この例は遡及して洗い替えたいっていうもので別物だよ。
小売でセールの期間でどうなったかを後から決めてみたり
アパレルで単価が後付で決まるなんてのは当たり前。
当たり前なのが分かってるならテーブルも分けとけって話。
742NAME IS NULL:2012/02/06(月) 23:39:52.74 ID:cX/NfMiX
あなたの隣の集団ストーカー
駅改札や駅周辺で、人の流れを見張っているのが犯人です。
犯人はナマポで税金で食べていけるため通勤、通学者を
馬鹿にしながらターゲットを見張っています。
エア待ち合わせとエア電話が得意です。
エア荷物、エアマスクもいます。鉄道職員にも犯人がいます。
743NAME IS NULL:2012/02/09(木) 18:23:03.30 ID:T/tz/FZg
■商品テーブル(item)
■商品のタグ用テーブル(item_tag)

があるとして、1商品につき複数タグを投稿できるとします。
(ニコニコ動画みたいなイメージです)

大体は、タグテーブルに「id、item_id、comment」
というフィールドを作成すると思うのですが、
ニコ動とは違って、登録・編集画面で
いくつかのタグをあらかじめ指定する形を考えています。

1商品に対するタグを変更する場合、
一旦、該当する商品のタグを全削除して
改めて追加する仕様が思いつくのですが、
考え方が間違っている気がしてなりません。。

説明が下手で申し訳ありませんが、分かる方はアドバイスをお願いします。
744NAME IS NULL:2012/02/09(木) 18:36:44.14 ID:???
>>743
タグとコメントの違いはなんですか?
745NAME IS NULL:2012/02/09(木) 19:23:28.70 ID:T/tz/FZg
タグテーブルに「便利」とか「面白い」とかのタグコメントが入るという意味です
746NAME IS NULL:2012/02/09(木) 19:30:44.61 ID:???
タグづけは多対多だからテーブルが全部で3つ必要
747NAME IS NULL:2012/02/09(木) 19:40:49.93 ID:???
タグとはコメントのことではないようですね。
ではタグとはなんですか?
748NAME IS NULL:2012/02/09(木) 19:41:50.31 ID:???
商品本体と商品タグの組み合わせか
749NAME IS NULL:2012/02/09(木) 19:43:48.22 ID:???
ニコニコ動画みたいに商品タグを投稿できるというのがよくわからんが
ニコニコ動画には動画投稿以外に投稿あるのか
750NAME IS NULL:2012/02/09(木) 19:48:01.87 ID:T/tz/FZg
ニコ動は動画毎にユーザがタグを設定できるよ
751NAME IS NULL:2012/02/09(木) 19:49:16.52 ID:T/tz/FZg
>>746
商品とタグテーブルは分かるのですが、それ以外は分からずです
>>747
nameにした方がわかりやすかったですね。すみません。
752NAME IS NULL:2012/02/09(木) 20:08:25.36 ID:???
>>751
nameだと商品名、すなわち商品ごとに1つづつ異なって割り当てられる属性ですよね?
タグというのは商品名のような扱いを受けてもいい?
何をしたいのかを明確に表現できれば、テーブルの形は自然に決まると思いますよ。
753NAME IS NULL:2012/02/09(木) 20:12:35.43 ID:T/tz/FZg
>>752
いえ、>>743に書いたタグテーブルの「comment」が気になったんですよね?
だから「タグの名前=nameにしたらよかったです」と言いました。
商品名だったら、「商品名の名前です」と書きます。
754NAME IS NULL:2012/02/09(木) 20:15:36.30 ID:T/tz/FZg
商品名の名前って変な言い方ですね・・・すみません。

とりあえず、現状のテーブル構成を再度書きますと、

■商品テーブル(item)
id、name
■商品タグテーブル(item_tag)
id,item_id,name

と、ここまでの設計は考えつくのですが、
これだと、商品に対するタグを割り当てる(登録)時や
編集する時に、いちいちタグテーブルを削除して再度登録しなければ
行けないのかと思い、設計が間違っているのでは?と感じて質問しました。
755NAME IS NULL:2012/02/09(木) 20:17:38.10 ID:???
>>753
なるほど。ではあなたにとって、タグテーブルで扱われるタグとはなんですか?
756NAME IS NULL:2012/02/09(木) 20:18:47.76 ID:???
商品タグって、値札のことだよな
757NAME IS NULL:2012/02/09(木) 20:19:53.45 ID:???
ニコニコ動画みたいにユーザーが値札を投稿できるようにしたいんだ?
758NAME IS NULL:2012/02/09(木) 20:41:26.67 ID:???
>値札を投稿

オークション?
759NAME IS NULL:2012/02/09(木) 20:48:46.27 ID:???
>>751
アイテムとタグの関連を記録するテーブルをつくるんだよ
760NAME IS NULL:2012/02/09(木) 20:48:51.89 ID:???
つまりこういうことだろ?

タグテーブル
id,name
761NAME IS NULL:2012/02/09(木) 21:02:28.33 ID:???
DBってあんまり使った事なくて、一度使ってみようと
アプリはJavaで作ってて、1秒ごとに数十バイトのデータをUDPでばらまいて
るLANからデータ取ってます。秒単位のデータを60個で分データにして
分データ60個で時データに集計するものです。
とりあえずDB使った事ないからApacheDerbyで組んだら鬼重くて死にそう
なんですがどんなDB使った方がいいんでしょうか?
sec_data (intime datetime, v1 int, v2 int ...10個くらい)
min_data (intime datetime, v1 int, v2 int ...10個くらい)
hour_data (inttime datetime, v1 int, v1_avg int, ... 15個くらい)
データの集計はdatetimeをbetweenしてます。
762761:2012/02/09(木) 21:05:49.41 ID:???
マシンはatomの2コアで
DBをramディスク(/dev/shm)に作ってますが集計マジ重いです。
763NAME IS NULL:2012/02/09(木) 21:24:46.55 ID:???
そもそもatomというのが…
764761:2012/02/09(木) 21:33:36.09 ID:???
>>763
ですよね。。
場所の制約で組込み用の86マシンですから。。
ちなみにマシンスペックが普通のsandy3Gくらいの4コアだったとしたら
こんな要件にはどのDBで対応されますか?
765NAME IS NULL:2012/02/09(木) 21:41:50.02 ID:???
>>761
あまりにも固定サイズ過ぎて定型すぎる統計処理を頻繁にやるときって
RDBMSを計算で使わないよな。
766NAME IS NULL:2012/02/09(木) 21:44:43.13 ID:???
分データ、時データはいつ作るんだ?
767NAME IS NULL:2012/02/09(木) 21:46:21.81 ID:???
>>761
1秒ごとに数十バイトのデータをUDPでばらまいて
> るLANからデータ取ってます。秒単位のデータを60個で分データにして
> 分データ60個で時データに集計するものです。

そういうデーモンをC++で作ってしまえば、 毎秒百万回程度の速度で新着データを送られても
リアルタイムに集計を続けられる。
DBはバックアップ程度のつもりで複数行同時書き込みでもするくらい。読むことはない。
768761:2012/02/09(木) 21:53:23.62 ID:???
>>765
insert into min_data values (select sec_data avg(v1)....)
ってな感じにやってます。
>>766
分データも時データもシステム時間からです。
毎分・毎時にminなりhourに該当時間のデータあるか見てなければ前分データの集計
と前時データの集計です
データに時間の概念が無いので、秒データ受けたらシステム時間で"yyyy-MM-dd HH:mm:ss.SSS"で
insertしてます。
>>767
おっしゃる通りで、今までは普通にCでUDP受け、パイプでインメモリ集計
ただJavaやってみたいのとDB使ってみたかっただけです。
769761:2012/02/09(木) 21:56:51.05 ID:???
>>765
すいませんミス。。
insert into min_data select sec_data avg(v1)...between '00秒' '59秒'
ってな感じです。
770NAME IS NULL:2012/02/09(木) 22:49:28.50 ID:???
>>768
あなたのやっていることは、たとえ規模や速度に違いがあっても
「全国各地の自動化された震度計から送られ続けるデータを集計して、
必要に応じて緊急地震速報を流すシステム」に似てます。
ログなどを本システムとは異なる処理として非同期でDB保存することはあっても、
一旦DBに書いてそれを読んで集計するという設計はありえません。
771NAME IS NULL:2012/02/09(木) 22:55:55.95 ID:???
>>768
> おっしゃる通りで、今までは普通にCでUDP受け、パイプでインメモリ集計
> ただJavaやってみたいのとDB使ってみたかっただけです。

では同じ設計のままJavaで書く。
DBにはデータ保存だけしておく。
insertは数百件や数千件をまとめて。
毎分の集計ではDBを使わなくていい。
まれに特殊な条件で集計したくなったときだけDBを読む。
どうしても日常的に読みたければ必要最低限かつ十分なindexを用意する。
772761:2012/02/09(木) 23:01:22.36 ID:???
>>770-771
やはりそうですよね。やってみたかったからやってみたら
すっごい重くてどうにもこうにも。。得手不得手が有るのは承知です。
ただ単にDB触る事あんまり無いだろうからやってみたかったというのが実情です。
やっぱいつも通り正攻法で行きます。 ありがとうございました!
773NAME IS NULL:2012/02/09(木) 23:02:52.06 ID:???
>>769
SQLite3でインメモリDBを使った場合だと数msで終わる処理だね
Derbyの事情はまったく存じないけどインデックスとか効いてなさそう
774NAME IS NULL:2012/02/09(木) 23:25:01.11 ID:???
>>772
あなたがDB得意になったら、そのアイデアでも実用化できなくはない。あまりおすすめできないけど。
しかしDB苦手なうちにチャレンジしない方がいい。
それは教材に向いてない課題だから、今はその問題については諦めていいです。
他のもの作りましょう。
775NAME IS NULL:2012/02/11(土) 02:44:45.55 ID:???
ここって質問スレなの?
話した内容纏めないなら意味なくね?
776NAME IS NULL:2012/02/11(土) 08:35:54.70 ID:???
>>775
>ここって質問スレなの?

スレタイ嫁よ…
777NAME IS NULL:2012/02/11(土) 09:21:45.38 ID:???
>>775
新顔さんかな?
このスレでは以前からずっとDB設計相談室みたいになっていたから、
DB設計に関わる話題なら何でも好きに語ればいいし、
無理に纏める必要も無いと思う

少なくともしばらく前にあったような
DB設計そっちのけでグダグダした雑談をされるよりも、
今のほうがズット正常な流れだ
778NAME IS NULL:2012/02/11(土) 10:17:19.36 ID:???
DBそっちのけでグダグダ雑談してる方が正常に見える。
779NAME IS NULL:2012/02/11(土) 10:18:46.45 ID:???
>>775
君は内容を纏めることに意味を感じるのなら、
君が纏めればいいんじゃないかな。
780NAME IS NULL:2012/02/11(土) 10:20:14.68 ID:???
質問スレ別にあるし、業務毎とかで使いそうなデータ構造をwikiにでも纏められると嬉しいんだがね
781NAME IS NULL:2012/02/11(土) 10:26:21.98 ID:???
>>780
言い出しっぺの法則
782NAME IS NULL:2012/02/11(土) 13:22:36.84 ID:???
>>780
それが望ましいとあなたが思うなら、どうぞご自由におやりください
783NAME IS NULL:2012/02/11(土) 17:42:49.19 ID:DiI2hJrz
ネットショップで発送地域を選択する場合があります。

条件として
・複数選択可
・地域ごとに集計したい(例:東京に発送できるお店3件のような表示にしたい)
・エリアで選択出来るようにしたい(例:関東を設定すると、東京も神奈川も発送圏内となる)

こういった仕様の場合、発送地域テーブルに都道府県別で追加するのでしょうか?
それとも1カラムに選択した都道府県をカンマ区切りで入力するのでしょうか?

このような設計を行った経験がある方は教えて下さい。
784NAME IS NULL:2012/02/11(土) 18:31:32.28 ID:???
>>783
カンマ区切りなんてしないよ
785NAME IS NULL:2012/02/11(土) 20:36:37.36 ID:???
>>783
適切に正規化するのであれば、テーブルは4個必要になる
・注文テーブル
・注文-発送都道府県-関連テーブル
・発送都道府県テーブル
・発送地域テーブル

テーブル間の関連を以下に示す
・注文と発送都道府県は関連テーブルを用いてm対n関係
・発送地域と発送都道府県は1対m関係

テーブル数を減らすのであれば、正規化を崩して
発送地域と発送都道府県を一つのテーブルにまとめてしまう方法もある
786NAME IS NULL:2012/02/11(土) 20:54:28.70 ID:???
注文テーブルはどこから出てきたw
787783:2012/02/11(土) 20:58:01.14 ID:DiI2hJrz
>>785
そこまで分けると登録時のUIが想像出来ないんですよね・・・

例えば↓こういうフォームをよく見ますが、
□関東
□東京 □神奈川 □埼玉 □千葉 □茨城 □栃木 □群馬

選択した都道府県を「発送都道府県テーブル」に
追加していけばいいと言うのは想像できるのですが、
「関東」にチェックを入れた場合どうなるのでしょうか?
788NAME IS NULL:2012/02/11(土) 21:03:52.69 ID:???
>>785
> ・発送地域と発送都道府県は1対m関係

それでいいの?
ホテル検索とかでは
・東京
・新宿区
・23区以外の東京
・関東
・東京以外の関東
なんてのを区分として列挙するのを普通に見かけるんだけどな。
789NAME IS NULL:2012/02/11(土) 21:04:53.03 ID:???
>>787
UI の問題は他の場所で質問してください
790783:2012/02/11(土) 21:32:44.64 ID:DiI2hJrz
でも、設計が頓挫してるとUIにも影響が及び、運用出来ませんよね?
実用化まで想定するのが設計だと思いますが・・・
791NAME IS NULL:2012/02/11(土) 21:32:56.63 ID:???
>>787
Table: 発送地域テーブル

地域 | 県
----+---
関東 | 東京
関東 | 神奈川
関東 | 埼玉
関東 | 千葉
関東 | 茨城
関東 | 群馬
東京 | 東京
神奈川 | 神奈川
埼玉 | 埼玉
千葉 | 千葉
茨城 | 茨城
群馬 | 群馬

で、いいかと。
792NAME IS NULL:2012/02/11(土) 21:38:16.62 ID:???
>>770
なぜありえないんだ?
793NAME IS NULL:2012/02/11(土) 21:39:23.88 ID:???
>>790
それはお前の都合だろ
UIはスレチだから他所いけ
794783:2012/02/11(土) 21:53:45.72 ID:DiI2hJrz
>>791
これで行きます。ありがとうございます。

>>793
器小さいんですね
795NAME IS NULL:2012/02/11(土) 22:02:46.73 ID:???
>>794
脳にウジがわいてるみたいだな。ウザいから消えろ
796NAME IS NULL:2012/02/11(土) 22:05:44.12 ID:???
>>790
DBとモデル層がちゃんと作られてたら、あとからどんなUIを足してもいいし変えてもいい。
事前に想定されたUIとか必要ないし、そんなものの想定引っ張られて下位レイヤー作ってもろくなことにならんですね。
797NAME IS NULL:2012/02/11(土) 22:06:45.18 ID:???
>>791
リレーションしてない感が漂いまくって面白いな。
798NAME IS NULL:2012/02/11(土) 22:09:11.98 ID:???
リレーションするw
799NAME IS NULL:2012/02/11(土) 22:13:17.69 ID:???
>>798
普通に使うだろ
800NAME IS NULL:2012/02/11(土) 22:14:23.91 ID:???
>>797
ちょっとどの辺にリレーションしてない感が漂ってるのか詳しく説明願う。
801NAME IS NULL:2012/02/11(土) 22:26:22.42 ID:???
リレーション「する」って言い方をするのは、リレーショナルデータベースを
理論から学んでない人だろう。
802NAME IS NULL:2012/02/11(土) 22:30:43.00 ID:???
>>800
関東
803NAME IS NULL:2012/02/11(土) 22:34:24.25 ID:???
>>802
なにそれ?
説明できないなら、無理にとは言わないけど。
804NAME IS NULL:2012/02/11(土) 22:36:53.86 ID:???
>>803
理解できないならムリしなくていい
805NAME IS NULL:2012/02/11(土) 23:02:07.81 ID:???
そもそも>>783は貰った回答を理解できなかったから具体例を上げて更に尋ねたんだろ
それを視野狭窄な>>789がフォームという単語に反応して変な事を言い出しただけに読めるな
806NAME IS NULL:2012/02/11(土) 23:06:44.43 ID:???
>>805
みえませんな
807NAME IS NULL:2012/02/11(土) 23:08:14.91 ID:???
レベル低っ
808NAME IS NULL:2012/02/11(土) 23:08:59.03 ID:???
巣に帰ればいいのに
809NAME IS NULL:2012/02/11(土) 23:18:50.09 ID:???
>>800
わかんないやつなんかどうでもいい
810NAME IS NULL:2012/02/11(土) 23:21:15.16 ID:???
>>791
とりあえずダメっぽさがある
811NAME IS NULL:2012/02/11(土) 23:23:31.78 ID:???
>>801
英語では動詞としても使われるし
英文ドキュメントに慣れた人同士だと
DBに限らず色んなところでよく使う
812NAME IS NULL:2012/02/11(土) 23:25:58.93 ID:???
>>811
どうでもいいが動詞ならrerateでは。
813NAME IS NULL:2012/02/11(土) 23:26:40.35 ID:???
typo relate
814NAME IS NULL:2012/02/11(土) 23:26:44.94 ID:???
そういう問題じゃねぇwww
815NAME IS NULL:2012/02/11(土) 23:30:27.76 ID:???
このスレ的にいえば
一般にリレーションってといえば列と列との関連だぞ。
リレーションシップはエンティティ間の関連。

816NAME IS NULL:2012/02/11(土) 23:32:40.69 ID:???
お、おう
817NAME IS NULL:2012/02/11(土) 23:33:25.58 ID:???
>>791
とりあえず
東京|東京
以下はいらんな
818NAME IS NULL:2012/02/11(土) 23:41:58.90 ID:???
おい、おまいらそれよりもっと頭のよさそうな事言おうぜ!
819785:2012/02/12(日) 02:12:10.13 ID:???
レス遅れた、スマソ

>>787
基本的に>>796の意見に賛同する
以下、>>796と重複する部分はあるけど、自分なりにコメントする

UI層は(>>796も指摘しているように)頻繁に仕様が追加/変更されるものだし、
(UI無しに)他店APからの一括注文をメッセージとして受信することも考えられる
それに対してDB層は(単純なフィールド追加等を除く)仕様変更には多くのコストが必要なので
DB仕様の安定性が重要になる
だから、DB設計においては極力UI層への依存部分を減らす努力が必要

具体的には、たとえば
・UI層でイベント「関東チェック」が発生すると、
・モデル層の都道府県一括更新手続きが起動され、
・都道府県テーブルへ地域コードを条件とした一括UPDATE文(SQL)を発行する
いう実装が考えられる

追記:>>794の下段はいわゆる「余計な一言」、スルー耐性を習得汁!
820NAME IS NULL:2012/02/12(日) 02:41:40.56 ID:???
大分類、中分類、小分類や、今回の地方、県のように本来階層をもつ分類を
フラットな1個のテーブルに入れてしまう設計はどうだろうか?

コード,親コード,名称
  01,  NULL,関東
  02,   01,東京
  03,   01,千葉

みたいな設計
メリットデメリット語ってくれ
821NAME IS NOT NULL:2012/02/12(日) 02:44:14.92 ID:???
メリットになるケースがほとんどない
822NAME IS NULL:2012/02/12(日) 02:46:16.70 ID:???
>>820
配達地域区分とか商圏とかホテル検索で使われるエリアとか、
都道府県市町村などの行政の階層と一致してないので、
行政の階層にだけ合致させた設計は実情にそぐわなくなる。
823NAME IS NULL:2012/02/12(日) 02:49:46.35 ID:???
行政じゃないものを行政の階層にまぜまぜするのが変なだけ
別テーブルにすればいい
824NAME IS NULL:2012/02/12(日) 02:52:31.81 ID:???
日本は長らく都道府県の再編が止まってるから実感しにくいかもしれないが、
都道府県が持つ地理的な範囲と自治体とは異なる情報。
市町村で考えれば分かるかな?
合併ブームだったとき、地理的な範囲を表現するために市町村コードなんか使ってたら合併の前後でデータ不整合が起きたり。
825785:2012/02/12(日) 03:17:09.42 ID:???
>>788
まず、顧客要望(>>783)からの(身勝手な)推測と
受注業務における発送先区分体系はホテル業務や運送業務ほど複雑にはならないという
常識から、>>785くらいで十分であろうという考え方が一つ

次に>>788の懸念への対応については、
ちょうど>>820から議論が始まったので、そちらを参考にしてください
826NAME IS NULL:2012/02/12(日) 03:39:44.97 ID:???
>>822-823
つまり>>788の例でいけば、必ずしも東京都と新宿区が別階層である必要はない、って解釈でいいのか?

階層をどうとるか、って問題はあると思うが、階層がある、って前提で>>820を考えたらどうだろう

メリットとしては階層の変更しやすいとか、階層が可変な場合に有効とか思いついたんだが
827NAME IS NULL:2012/02/12(日) 07:36:24.80 ID:???
>>804
了解、指摘はするけど説明はできないと言うことね。
828NAME IS NULL:2012/02/12(日) 14:16:08.99 ID:???
ほほえましいねぇ
829NAME IS NULL:2012/02/12(日) 16:39:04.27 ID:???
わかってないのは君だけだよ
830NAME IS NULL:2012/02/12(日) 16:46:35.57 ID:???
一般論として、この手の問題で
分からないと主張する人が分かることの第三者へのメリットは滅多にないが、
当事者はそのことを理解しにくい
831NAME IS NULL:2012/02/12(日) 16:49:36.19 ID:???
>>828-830
理解できてないのは認めるけど、説明できてないのも事実だよね。
832NAME IS NULL:2012/02/12(日) 16:55:00.73 ID:???
>>831
説明する人が説明したくなる理由を作るのは、尋ねる側の説得力だよね。
ストップして誰も損だと思わないならそこで話ストップしても仕方ないし。
833NAME IS NULL:2012/02/12(日) 17:06:58.66 ID:ZWuWv+oz
いや、スルーしろよw
834NAME IS NULL:2012/02/12(日) 17:14:58.57 ID:???
スルーかわいそう
835NAME IS NULL:2012/02/12(日) 17:30:53.33 ID:???
>>832
> リレーションしてない感が漂いまくって面白いな。

の理由を聞いてるだけなんだが、説明できないなら別にストップしてもらっていいよ。
指摘だけしたい奴って、別に珍しくないから。
836NAME IS NULL:2012/02/12(日) 17:33:18.36 ID:???
>>835
お前も含めてみんな分かってるんじゃないか?
837NAME IS NULL:2012/02/12(日) 18:24:21.19 ID:???
スレがリレーションしてない感でヤバイ
838NAME IS NULL:2012/02/12(日) 18:34:46.46 ID:???
つかさ、みんなリレーションしようぜ
839NAME IS NULL:2012/02/12(日) 18:39:03.23 ID:???
リレーションできない制約なんだよ
名前を見るんだ
840NAME IS NULL:2012/02/12(日) 19:12:44.54 ID:???
俺はトゥギャザーしたい
841NAME IS NULL:2012/02/12(日) 19:37:30.78 ID:???
お後がよろしいようで
842NAME IS NULL:2012/02/12(日) 22:18:55.44 ID:???
>>836
結局説明はなしということね。
まあ、想像通りの結末だったな。
843NAME IS NULL:2012/02/12(日) 23:57:55.59 ID:???
UIから入ってもいいけど、考え方は整理しないとな・・・
画面をつかう人の選択範囲として適切なのは何だ?
そこから何を判断基準として何を選ぶのか?
場所でいいのか?まずは商品から入るんじゃないのか?

あとは要件として鵜呑みにしていいか疑問なのが・・・
発送地域ってのはショップの都合で決まるのか?
日本国内ごとき、送ろうと思えばどうとでもなるんじゃないのか?
料金・納期の問題じゃなくて制約なのか?ホントか?
844785:2012/02/13(月) 00:34:06.65 ID:???
考え方を整理したり要件を分析するのはいいけれど、
ここがDB設計であることを忘れずに議論することを望む
845785:2012/02/13(月) 00:38:09.78 ID:???
訂正

X: ここがDB設計であることを忘れずに
O: ここがDB設計スレであることを忘れずに
846NAME IS NULL:2012/02/14(火) 00:09:44.49 ID:???
現実を写像するとかいうキレイ事の設計なぞほとんどない。
オッサンのタワゴトやらウソだらけの現行システムドキュメントを紐解くんだ。

心憎いばかりに分析されたシンプルな作りで、少々のこる不可解な部分は
今は分からないが半年後1年後にユーザーが泣いて喜ぶ仕掛けが埋め込まれてる。

・・・てな事をするのが設計だろ?
847NAME IS NULL:2012/02/14(火) 00:28:35.85 ID:5gjofXZ3
>今は分からないが半年後1年後にユーザーが泣いて喜ぶ仕掛けが埋め込まれてる。
ここってニュアンスによっては微妙だよね
工数掛けずに出来るならいいけど、無駄に拡張性のために工数を使うのはプロの仕事じゃないと個人的に思う
要件外でって意味でね
848NAME IS NULL:2012/02/14(火) 01:24:50.52 ID:???
>>847
受託のようなプライド不要の世界は捨てておくとして、
多くの設計の世界で、真の要件は与えられるものではないんだがな。
849NAME IS NULL:2012/02/14(火) 02:29:33.93 ID:???
>>847
もちろん時限爆弾だと思う。
逆にとったとしてもイースターエッグは今喜ばれないから、これもアウト
850NAME IS NULL:2012/02/14(火) 08:22:36.52 ID:???
>>846
拡張はリレーションを張っていけばいいのて、エンティティの設計レベルではあまり気にしたことはないな。どこに張ったらいいかで悩むことは多々あるけど。
851785:2012/02/16(木) 09:52:18.65 ID:???
>>846
>現実を写像するとかいうキレイ事の設計なぞほとんどない。

そういうセリフが吐けるのは「キレイ事の設計」ができるようになってから

そんなDB設計の基礎ができていないヤシラに限って、
>心憎いばかりに分析されたシンプルな作りで、少々のこる.....
などという、独りよがりで過去の経験だけを頼りにした運頼みの設計をやらかす
その結果、そんなシステムの保守を引き継いだ若手からは、
「オッサンのタワゴト」やら「ウソだらけ」と揶揄されることになる
852NAME IS NULL:2012/02/16(木) 19:40:13.30 ID:???
動けばいいんだよ。
853NAME IS NULL:2012/02/16(木) 20:16:19.94 ID:vGOJXvuM
done is better than perfect
だっけ?
854NAME IS NULL:2012/02/18(土) 00:10:19.67 ID:rYOpOyI8
>>851
正規化するとテーブルが4つだのナンだの言う前に、たった数行の中に
「発送地域」「地域」「エリア」「発送圏内」
とこれだけ用語を乱発してるのを何とかしてやるのが先だろ

表現が安定しないやつもそうだが、そこを正そうとしないで設計にすぐ
入りたがるやつにも碌なのがいなかった

なあなあで握って進めるから、破綻が判明するのはだいぶ後のテスト時
855NAME IS NULL:2012/02/18(土) 11:03:10.92 ID:???
たしかにな
用語の定義をちゃんとしないやつは
相手との認識も合ってない
856NAME IS NULL:2012/02/21(火) 07:57:58.26 ID:???
おっさんがいないとスレが止まるな
857NAME IS NULL:2012/02/21(火) 07:58:15.50 ID:???
誤爆したorz
858NAME IS NULL:2012/02/24(金) 06:36:32.80 ID:I/XWi+Yk
m対n(=多対多)の関係はRDBで表現できないのはご存知?
859NAME IS NULL:2012/02/24(金) 07:38:22.87 ID:???
は?
860NAME IS NULL:2012/02/24(金) 13:21:44.33 ID:???
交差エンティティ作れば済むじゃん
861NAME IS NULL:2012/02/24(金) 13:30:42.97 ID:???
トランザクションの概念を語るとき、よく銀行のシステムが持ち出されますが、
これら銀行のシステムでも設計の仕方によってはトランザクション不要に出来ますでしょうか?
862NAME IS NULL:2012/02/24(金) 14:09:01.85 ID:???
>>861
トランザクションやRDBMSの概念が生み出されるよりも、
銀行システムの誕生の方が早いので。
863NAME IS NULL:2012/02/25(土) 04:49:04.16 ID:HfP19wuV
>>860
そう。交差エンティティ作って1対多の関係にしなければいけない。
864NAME IS NULL:2012/02/25(土) 07:42:30.11 ID:???
アホか。
まぁ、「交差エンティティを作れば」表現できるという答も100%正解ではないが。

ほら、これがABとabの多対多関係を交差エンティティを使わずに表現したものだ。
(A,a)
(A,b)
(B,a)
(B,b)
865NAME IS NULL:2012/02/25(土) 13:06:00.63 ID:???
まぁ、「交差エンティティを作れば」表現できるという答も100%正解ではないが。

イミフ
866NAME IS NULL:2012/02/25(土) 13:14:44.83 ID:???
>>865
> まぁ、「交差エンティティを作れば」表現できるという答も100%正解ではないが。
> イミフ

何を言ってるのやら
867NAME IS NULL:2012/02/25(土) 13:18:26.10 ID:???
>>866
交差エンティティで表現出来ない多対多の例をあげてみてくれないか
868NAME IS NULL:2012/02/25(土) 13:28:30.90 ID:???
>>867
単に『まぁ、「交差エンティティを作れば」表現できるという答も100%正解ではないが。イミフ』という表現から伝えたいことが伝わってこないというだけ
869NAME IS NULL:2012/02/25(土) 14:01:59.15 ID:???
99%の正解って言うのがあるのか?
870NAME IS NULL:2012/02/25(土) 14:12:35.93 ID:???
>>867
逆だ。
交差エンティティ「でも」多対多を表現できるというだけで、それが
必須というわけじゃないということ。
871NAME IS NULL:2012/02/25(土) 20:33:28.23 ID:???
>>870
多対多は...

・交差エンティティで表現できる ... 正解
・交差エンティティでも表現できる ... 正解

・「交差エンティティを作れば」表現できるという答も100%正解ではない ... 不正解

つまり、>>863 は、馬鹿ということ。
872NAME IS NULL:2012/02/26(日) 02:16:32.26 ID:???
>>864は論理的な考え方ができない子なんだな
873871:2012/02/26(日) 08:09:49.38 ID:???
>>863
スマン、レス番間違えた。

>>864 だった ... orz
874NAME IS NULL:2012/02/26(日) 09:22:00.01 ID:???
>>863は馬鹿、で合ってると思うぞw
875NAME IS NULL:2012/02/26(日) 16:33:48.38 ID:???
>100%正解ではない ... 不正解
>>871も馬鹿であっているw
876NAME IS NULL:2012/02/26(日) 16:38:24.59 ID:LKTjkoST
少なくともレス番間違えて話をgdgdにするのは馬鹿に違いない
877NAME IS NULL:2012/02/26(日) 17:12:37.22 ID:???
>>875
>>100%正解ではない ... 不正解

また、アホが一匹でてきたぞ。
878NAME IS NULL:2012/02/26(日) 17:13:04.13 ID:???
つまり>>864が変ってことか
879NAME IS NULL:2012/02/26(日) 18:03:50.13 ID:???
>>871
100%正解ではないという表現が悪いのか。じゃあ表現を変えよう。
RDBで多対多関係を表現するのに交差エンティティを用いればいい
ってのは十分条件にはなってるけど必要十分じゃあない。
お互い従属関係を持たない2つの属性からなるリレーションはそれ自体
多対多関係を表現できるんであって、それは交差エンティティに限らない。
880NAME IS NULL:2012/02/26(日) 18:34:26.05 ID:???
・2は偶数だ
・人は哺乳類だ
↑こーいうのまで否定しだしそうだなw
↓こーいうのが否定出来る事と混同してる
・偶数は2だけだ
・哺乳類は人だけだ
論理学やり直してきた方がイイ
881NAME IS NULL:2012/02/26(日) 18:39:26.73 ID:qIMlerSN
>>864が言っている組み合わせを格納できるエンティティがまさに交差エンティティなんだが。なんでみんな突っ込まないの?
882NAME IS NULL:2012/02/26(日) 18:40:50.31 ID:???
話題が基礎的すぎて興味ないんだろ
883NAME IS NULL:2012/02/26(日) 18:42:44.36 ID:???
もう放置でいいんじゃね?
884NAME IS NULL:2012/02/26(日) 20:48:19.43 ID:???
>>881
交差エンティティはエンティティ間の関連を表現するもので、ERモデルで
設計する場合に用いられるもの。>>864でいえばABあるいはabにあたる
エンティティが存在してそのとき>>864を交差エンティティと呼ぶが、
>>864はそうではない。
なんかそのへん混同している人が多いみたいだが、RDBとERは
イコールじゃないぞ。RDBの入門書なんかでいきなりエンティティが
出てくるものもあったりするから仕方ない面もあるが。
885NAME IS NULL:2012/02/26(日) 21:02:07.84 ID:???
お前らの言ってることが全然分からない
おすすめの書籍を教えて
886NAME IS NULL:2012/02/26(日) 21:30:16.89 ID:???
>>880
そういえば最近見たニュースで、「偶数と奇数を足すと必ず奇数になることを
説明せよ」という問題に「思いつく偶数と奇数を足したら全て奇数だった」という
回答を書いた大学生がいたというのがあったな。
887NAME IS NULL:2012/03/04(日) 08:00:00.89 ID:p3r4LXDn
掲示板をつくっています。
・親投稿
 └ 子投稿
 └ 子投稿
のように1つだけコメントができるようにしたいのですが、
投稿テーブル、コメントテーブルと分けたほうがいいですか?
同じ情報を保持しているので、なるべく1つのテーブルで簡潔させて、
なおかつJOINで1度に子投稿も一緒に取得したいのですが、
・実装方法・その実装での子投稿を含んだ投稿を取得するSQL
を助言してもらえませんか?

関連付けのためのテーブルができてもかまいません。
888NAME IS NULL:2012/03/04(日) 11:05:32.76 ID:???
>>887
あほか
889NAME IS NULL:2012/03/04(日) 14:17:36.42 ID:???
>>887
投稿テーブルとコメントテーブルで想定するフィールド名を示した上で、
SQL質疑応答スレ 12問目
ttp://toro.2ch.net/test/read.cgi/db/1316769778/
に行くといいよ。
890NAME IS NULL:2012/03/04(日) 15:50:04.00 ID:ku1dl9VL
今動いているシステムのER図を作りたいのですが
ダンプしたsql文放り込んだらER図を作ってくれるようなソフトありませんでしょうか?
891NAME IS NULL:2012/03/04(日) 15:51:27.03 ID:???
dbmsは?
892NAME IS NULL:2012/03/04(日) 16:09:29.30 ID:ku1dl9VL
MySQLですが、関係あります?
893NAME IS NULL:2012/03/04(日) 16:10:34.83 ID:???
Workbenchで桶
894NAME IS NULL:2012/03/04(日) 19:02:46.05 ID:???
>>887
親投稿(投稿テーブル)と子投稿(コメントテーブル)が「同じ情報を保持している」のだから、
単一テーブルで設計してもかまわないと思う

(本当に「同じ情報」であるという条件付き。後出しで「実は....」なんてのは勘弁してネw)

具体的なテーブル設計としては、たとえば以下のフィールドを持つ
単一の「投稿テーブル」を定義する
・投稿IDフィールド -- PK, シリアル型
・区分フィールド -- 文字列型, 値制約: "親" または "子"
・親IDフィールド -- FK, 整数型, 参照性制約: 投稿テーブル.投稿IDフィールド
・(その他の共通情報を表現する複数のフィールド)
親IDフィールドは、区分フィールド値が "子"の場合にのみ有効であり、
それ以外("親"の場合)はNULL(無効)とする

検索のSQL文については、まずは自分で考えよう(単一テーブルだから初歩レベルの問題)
もし考えても分からなかったら、このカキコを添えて>>889紹介のスレへ逝け
895NAME IS NULL:2012/03/05(月) 16:17:32.82 ID:???
>>894
区分フィールドいらなくね?
親IDがNULLなら親ってことだし
NULLがいやなら0でもいいけど
896NAME IS NULL:2012/03/05(月) 17:20:17.94 ID:???
>>894
子コメントの下にもコメントツリーをぶら下げられるようにしよう!
と、まるで専ブラやメーラーのように。

なんて言い出したとき、そのテーブルで「全然平気、任せとけ」と言えるか?
無駄を増やした挙げ句、能力を低下させてるかのようだ。
897NAME IS NULL:2012/03/05(月) 18:05:27.12 ID:???
>>896
そのときこそ単一テーブル化じゃないの?
コメントにコメントをぶら下げられるようにしよう!ってなったらさらにテーブル増やすの?
898NAME IS NULL:2012/03/05(月) 21:47:58.70 ID:???
>>897
区分フィールドもそのままで行くの?
899894:2012/03/05(月) 22:21:56.70 ID:???
>>895
たしかにこのお題(>>887)に限定すれば、
区分フィールド無しでも実装できるし設計も簡潔になるね

ただし、この区分フィールドは、親投稿と子投稿という
(投稿という全体集合に対する)部分集合に付けられた名前(ラベル)であり、
かつE-Rモデルにおける「エンティティ」を対象とする特性
それに対して、親IDフィールドは(E-Rモデルにおける)「リレーション」を表現する属性
つまり、E-Rモデル上で明確に区別される両者を
それぞれ区分フィールド(エンティティ)と親IDフィールド(リレーション)という形で
素直にDB設計へ反映させたのが、>>894の「キレイな設計」になる

これを理解した上で、(お題に限定して)設計を崩すことはかまわないと思う

>>896
すでに>>897が指摘しているけど、再帰的な親子関係(1:m関係)を実現するために
親IDフィールドを伴う単一テーブル方式を採用することは、よく知られた(=定石の)手法
900NAME IS NULL:2012/03/05(月) 23:01:35.51 ID:???
>>898
ある階層のデータを取得するのに、親子IDのみでは難しい(あるいはめんどくさい)場合に、階層を持たせることはあるね。
901NAME IS NULL:2012/03/06(火) 00:34:11.18 ID:???
>>899
子から先の孫以下ツリー生成に制限を持たせないように拡張する場合、
区分フィールドの仕様はどうなるの?
902NAME IS NULL:2012/03/06(火) 03:16:34.21 ID:???
素直にDBに反映させたってんならエンティティじゃない項目をエンティティのテーブルに入れるなよ
ちゃんとリレーション用のテーブル作るべきじゃねえの
903NAME IS NULL:2012/03/06(火) 06:41:45.83 ID:???
DB設計には論理設計と物理設計があるようですが、
・論理設計は正規化によって導き出された設計
・物理設計は、性能を考慮して論理設計を部分的に崩した設計
と考えてよろしいでしょうか。
またその場合、論理設計から物理設計をする場合に、どのようなことに気をつければいいか、
参考になるページや書籍を紹介してください。
論理設計はそれなりにできるようになったと思っているのですが、物理設計はまだよくわかってないです。
904NAME IS NULL:2012/03/06(火) 12:43:41.05 ID:???
>>903
崩すのは別の話だよ。
RDBMSが変わっても通用する抽象的なところまでが論理
905894:2012/03/06(火) 13:58:23.74 ID:???
>>898,901
>>899で書いた区分フィールの「意味」はそのまま適用できるけど、
(人の理解しやすさを配慮して)「表現」を変更するのが望ましいだろうね

たとえば、区分フィールドの値である "親" と "子" を、
それぞれ親を持たない "根"(ルート) と親を持つ "節"(ノード) に変える

>>902
E-Rモデル上の1:m関係を(参照性制約を伴う)フィールドとして実現するのは、
DB設計における常識ではないのかな?
そして、もしE-Rモデル上のm:n関係であれば、>>785の「関連テーブル」
(あるいは>>870の「交差エンティティ」)を用いる

これらの常識を無視した設計法は、(素直と呼ばず)「愚直」と言う
906NAME IS NULL:2012/03/06(火) 14:02:04.02 ID:???
>>905
どうしても区分フィールドを持たせたいようだけど、
そのメリットは何?
907894:2012/03/06(火) 14:53:53.74 ID:???
>>906
>>899を嫁
908NAME IS NULL:2012/03/06(火) 15:45:25.30 ID:???
>>905
1:nとm:nでテーブルレイアウト変えるのが、お前の「常識」なのね
その上で今回は1:nが前提であると


>再帰的な親子関係(1:m関係)を実現するために
>親IDフィールドを伴う単一テーブル方式を採用することは、よく知られた(=定石の)手法
素直に定石のとおりやらないのも愚直と言えるんじゃないですか?

常識だとかきれいな設計だとか、結局のとこ個人の好みレベルの話だぜ
909894:2012/03/06(火) 17:35:22.85 ID:???
>>908
今回のお題であれば、>>894では(NULLを含む)単一テーブル方式を提案したけれど、
形式的(formal)な美しさを重視すれば、
NULLを(あるいはヌル値を意味する0すら)含まない複数テーブル方式による設計もできる

で、そのきれいな(=形式的な美しさを重視した)設計を「どこまで崩すか」を判断するのは、
>>908の言う「個人の好みレベルの話」だと思うよ
たとえば今回のお題では、質問者のRDB理解度とRDB設計の定石を配慮して、
(最初の解答として)設計の単純な単一テーブル方式を「自分の好みで」選んだことになる

一般的ソフトウェア設計論として大切なのは、与えられたお題(顧客要求)に対して、
・【基本】まずは「きれいな設計」ができるようになること
・【応用】局面に応じて、それを「どこまで崩すのが適切か」を判断できるようになること
だと考える(>>851)
910NAME IS NULL:2012/03/06(火) 18:25:03.95 ID:???
いつから「きれいな設計」になったの?
911NAME IS NULL:2012/03/06(火) 18:44:21.14 ID:???
>>907
あれじゃ全然客観的な説明になってない。
ネジ曲がった好みを語ってるだけだ。
912894:2012/03/06(火) 18:46:27.66 ID:???
>>910
ン?、質問の意図が不明だけど、「きれいな設計」という表現の発端は>>846かな....

で、>>909の最後の段落で書いた「きれいな設計が大切」というのは、
自分の(=ある一個人の)考え方にすぎない
たとえば、>>852のような「動けばいいんだよ」という考え方もアリだね

要は、ここは「DB設計を語るスレ」なのだから、DB設計に関する話題なら
誰でも自由に自分の考えを好きなだけ語ればいいんじゃないのかと思う
913NAME IS NULL:2012/03/06(火) 19:03:04.70 ID:???
>現実を写像するとかいうキレイ事の設計なぞほとんどない。
「きれい事の設計」と「きれいな設計」じゃ意味が違うんじゃないのか?
914894:2012/03/06(火) 19:13:00.77 ID:???
>>911
まあ、説明を読んでも今すぐに理解できないのはしかたないね

もしかすると、それが>>846の言う

>少々のこる不可解な部分は
>今は分からないが半年後1年後にユーザーが泣いて喜ぶ仕掛け

の具体例なのかもしれないし....
915NAME IS NULL:2012/03/06(火) 20:03:08.42 ID:???
DB設計をモデリングだととらえる人と、DB設計はシステム構築の一部だととらえる人
立場によってDB設計という言葉で目指す方向が違うという話だな
916NAME IS NULL:2012/03/06(火) 20:28:07.58 ID:???
>>914
区分フィールドを無くすと何が損になるか説明できるか?
917894:2012/03/06(火) 20:56:06.78 ID:???
>>916
そりは半年後1年後のお楽しみとして、取っておけばいいんジャマイカと....

今すぐ答えが欲しいなら、ヒントは>>909にある
918NAME IS NULL:2012/03/06(火) 21:20:59.95 ID:???
www
「半年後1年後にユーザーが泣いて喜ぶ仕掛け」って、文字通りの意味だったの?
919NAME IS NULL:2012/03/06(火) 21:34:26.32 ID:???
>>894
関連テーブルと交差エンティティって何が違うの?
920894:2012/03/06(火) 21:56:23.97 ID:???
>>903
>DB設計には論理設計と物理設計があるようですが、...(中略)...と考えてよろしいでしょうか。

論理設計とは、概念モデル(E-Rモデル)から論理モデル(リレーショナルデータベース)への
データモデリング活動のことだよ
>>904が指摘してくれているように、(RDBMSに依存しない)抽象的な話
そして、RDB構築/運用に関わるクラスタ構成やディスク容量などを決めるのが物理設計

>参考になるページや書籍を紹介してください。

論理設計がそれなりにできるという自信が付いているなら、
ここらで基礎に立ち返って論理設計を基礎から勉強し直すのがいいんじゃないかと思う
自分の推薦する(再)入門書は、以下の1冊
・リレーショナルデータベース, 増永良文著, サイエンス社
 http://www.amazon.co.jp/dp/4781910246
ただし、ソフトバンク系の「サルでもわかる...」や「はじめての....」に慣れた人にとっては、
最初は堅苦しくて難解な書籍に見えてしまうかもしれない
921894:2012/03/06(火) 21:58:58.03 ID:???
>>919
それぞれが同じ概念の別名だよ
他には、対照表とかアソシエーション(関連)と呼ばれることもあって、さまざま
922NAME IS NULL:2012/03/06(火) 22:20:46.15 ID:???
>>917
> 今すぐ答えが欲しいなら、ヒントは>>909にある

909には役立つこと何も書かれてないような
923NAME IS NULL:2012/03/06(火) 22:44:49.53 ID:R4aG0PyG
データベース設計の話なのかどうか分からないけど、

例えば以下の様なテーブルがあったとして、

―――――
ID:項目
1 :AAAA
2 :BBBB
3 :CCCC
―――――

これをコンボボックスなどでユーザに選択してもらう画面があり、
各選択内容により処理を分けたい場合。

そのこのデータの時にはこの処理という分岐させると言う情報は
どこでどの様に持つのがいいんだろか?
924NAME IS NULL:2012/03/06(火) 22:49:23.00 ID:???
>>923
アプリの実装かフレームワークの話だね。
部品を使い回すならDBに持つ項目が増えるだけ。
925NAME IS NULL:2012/03/06(火) 22:49:28.41 ID:???
DB設計とはまったく関係ないな。
926NAME IS NULL:2012/03/07(水) 05:14:22.09 ID:???
ソーシャルゲーのスコアで、通算とは別に日毎にランキング作るとなったら
お前らならどうする?日別に使い捨てのテーブル作る?
927NAME IS NULL:2012/03/07(水) 08:05:27.40 ID:???
普通にスコアを日ごとに集計すれば良いだけじゃないのか
使い捨てのテーブルとか意味わからんわ
928NAME IS NULL:2012/03/07(水) 08:11:47.15 ID:???
>>926
プレイデータのタイムスタンプを元に1日分切り出して処理すればインジャネ?
929NAME IS NULL:2012/03/07(水) 11:24:05.19 ID:???
説明足りんかったか。
ユーザーが表示する度に集計してたら時間かかるだろ?
だから定期的に集計してランキング情報だけのテーブルに入れておくのさ。
ID ユーザー名 スコア 順位 時間 みたいな感じで。
でこれをページネーションしながら表示する。
更新はバッチで1時間に1回とかにする。

このやり方だと日毎にテーブル作る発想が出てくる。
そもそもお前らならこのやり方を取らない?
930NAME IS NULL:2012/03/07(水) 12:06:55.34 ID:???
>>926
ユーザーidと日付値の複合キーでuniqueするんだよ
931NAME IS NULL:2012/03/07(水) 12:10:15.04 ID:???
>>929
ソーシャルゲーのランキングなら、打てば響くようにリアルタイム変化するのが鉄則だろ。
一時間に一度の集計で変化するなら無い方がいい。
932NAME IS NULL:2012/03/07(水) 13:03:27.22 ID:???
お前らお前らうるせーな
日ごとのランキングの履歴が見たいってなるよどうせ
933NAME IS NULL:2012/03/07(水) 13:14:33.82 ID:???
>>929
お前がどれだけの規模のものを作ってるかしらんが、その程度の集計で
レスポンス悪化するようなシステムのDB設計はお前の手にあまるぞ

負荷対策として集計済みのデータを実テーブルに保持することは無くはないし
それをバッチ更新で集計することも要件として無くはないが
俺なら今回のような話なら、集計テーブル作ったとしても更新はトリガでやる

いずれにしても、スコアデータが増えても、集計テーブルの行が増えるだけの話で
日ごとにテーブル作るとかあり得ん
934NAME IS NULL:2012/03/07(水) 15:05:48.91 ID:???
>>932正解で、数日分は過去閲覧用にデータとっとく必要がある。

「その日のスコア」というカラムはシステム内に存在しないので、やはりランキング用のテーブルが要るな。
日付カラム加えて、ユーザーの行動トリガでランキングテーブルにINSERT/UPDATEして、
表示の際は
・日付で抽出
・スコアでソート
・サブクエリで順位を振る
・ページネーション
これらをやるSQLで抽出して表示かな。
10万件ぐらいだったら余裕ですか?Amazonのスモールサーバーなんだけど。
935NAME IS NULL:2012/03/07(水) 15:26:50.87 ID:???
いいね、その調子でサーバのスペックが低いからだ!って文句をいう人になってくれ
936NAME IS NULL:2012/03/07(水) 15:39:54.66 ID:???
ソーシャルも思いっきり当たると、一日の更新回数が数億とか行く。
それくらいを前提にするなら小細工しないで俺に丸投げしろよ。
こちとら昔からオンラインゲームのランキングだとか衝突データ処理の専門家だからな。
937NAME IS NULL:2012/03/07(水) 22:44:37.88 ID:???
数億かぁ。ありそうだなぁとおもったけど、適当に予測したらどう考えても桁が足りなくね。
ほどほどに当たったアプリなら数億ですむかも
938NAME IS NULL:2012/03/08(木) 00:52:31.30 ID:???
当たったら当たった時に考えろ
939NAME IS NULL:2012/03/08(木) 01:20:55.84 ID:???
ぶっちゃけ、大きく当たったらRDBMSでランキングとか無理だから
中規模な辺り具合でギリギリ
940NAME IS NULL:2012/03/08(木) 01:35:13.03 ID:???
MapreduceやHadoopを使えってこと?
941NAME IS NULL:2012/03/08(木) 02:01:34.03 ID:???
リアルタイムで激しく変化する人の順序の管理を
ストレージ系のプログラムにやらせたら速度出ないし

毎秒数千くらいで限界来そう
942NAME IS NULL:2012/03/08(木) 03:02:41.88 ID:???
中規模だとアクティブユーザが10万人ぐらいかなぁ。
毎日一人あたり数百回更新するだろうから、適当に300として、1日3000万更新、秒間350更新ぐらい。

で、毎秒数千ぐらいで限界が来そうってことは、この7-10倍くらいをさしてそうだから、
アクティブユーザ100万人ぐらいまでは耐えられるってことか。
結構いけるね。
943NAME IS NULL:2012/03/08(木) 03:17:46.94 ID:???
>>942
夜間のピークは平均の何倍にもなるし
多くのユーザーはサービスが重くなってくると余計に負荷をかける動きになる
944NAME IS NULL:2012/03/08(木) 04:08:30.29 ID:???
実際自分でやってても更新が発生する処理を1-2回/秒はしてるもんなぁ。
945NAME IS NULL:2012/03/08(木) 06:00:21.19 ID:???
だからプレイヤー数が多いゲームのランキングって、大抵リアルタイムじゃないんじゃない?
ソーシャルゲーのランキング見ると毎日AM4時頃更新されますとか書いてあるぞ。深夜のバッチ処理か。
946NAME IS NULL:2012/03/11(日) 05:23:45.35 ID:???
会議室貸出システムで部屋の時間割をどう設計すればいいのか
悩んでます。

・貸し出す部屋は例えば15部屋ある
・ある日付だけ部屋数を増やすこともある
・ある特定の期間だけ部屋数を増やすこともある
・各部屋の貸出時間枠(開始時間と終了時間)を変えることもある
・時間枠の変更は特定日だけの場合と特定期間だけの場合もある
・DB設計とは関係ないけど部屋の空きをカレンダー表示する

どうするのがいいのですかね??
947NAME IS NULL:2012/03/11(日) 08:47:53.15 ID:???
お前には無理なことを白状して
スキルある奴に任せる
948NAME IS NULL:2012/03/11(日) 09:25:13.52 ID:???
質問スレじゃ無いんだから、丸投げじゃそうなるわな
自分で大枠示して意見求めるくらいじゃねーと
949NAME IS NULL:2012/03/11(日) 09:31:15.73 ID:???
んだね。質問スレじゃないから設計でどうしようとしてるのかくらい出してほしいね。
ベタにカレンダーテーブル作って日付に対して部屋番号と時間枠入れればいいんじゃない?と言っておくw
950NAME IS NULL:2012/03/11(日) 11:47:48.29 ID:???
>>946
DB設計の一例
【基本的な考え方(E-Rモデル)】
・テーブルは3つ定義する:利用者テーブル, 部屋テーブル, 貸出テーブル
・利用者と貸出および部屋と貸出の関係は、それぞれ1:m関係
 言い換えると、(関連テーブルである)貸出を介して利用者と部屋の関係はm:n関係
【各テーブルのフィールド定義】
・利用者テーブル
 ・利用者ID フィールド -- PK, シリアル型
 ・利用者名フィールド -- 文字列型, NOT NULL
・部屋テーブル
 ・部屋ID フィールド -- PK, シリアル型
 ・部屋名フィールド -- 文字列型, NOT NULL
・貸出テーブル(関連テーブル)
 ・貸出期間フィールド -- 期間型, NOT NULL
 ・利用者ID フィールド -- FK, 整数型, NOT NULL, 参照制約: 利用者テーブル.利用者IDフィールド
 ・部屋ID フィールド -- FK, 整数型, NOT NULL, 参照制約: 部屋テーブル. 部屋IDフィールド
 ・開始時間フィールド -- 時間型
 ・終了時間フィールド -- 時間型
【貸出テーブルに関する補足】
 ・フィールドの組 <貸出期間, 利用者ID, 部屋ID> に対してUNIQUE制約とし、複合キーを形成
 ・貸出期間フィールドの開始日と終了日が等しい場合、その貸出レコードが特定日であるとみなす
 ・開始時間/終了時間フィールド値の解釈は、要求仕様に応じて以下の2通りから選ぶ
  ・貸出期間フィールドの開始日(=先頭)と終了日(=末尾)だけを対象とする
  ・貸出期間に含まれるすべての日付を対象とする

951950:2012/03/11(日) 12:54:04.10 ID:???
>>946のお題(=要求仕様)について、
>・各部屋の貸出時間枠(開始時間と終了時間)を変えることもある
>・時間枠の変更は特定日だけの場合と特定期間だけの場合もある
の「変える」という部分を「利用者の入力項目」であると解釈して設計したのが>>950になる

ただ、これはもしかすると「貸出管理者側の制約条件」を「変える」という意味なのかな?
たとえば「ある期間では特定の時間枠に限って貸出を許可する」みたいな....
もしそうであれば、DB設計(の貸出テーブル定義)も変わってくるね

とりあえず、>>946のレスを待つ事にしよう
952946:2012/03/11(日) 13:06:51.35 ID:???
事故解決しました。
953946:2012/03/11(日) 13:10:05.40 ID:???
自決しました。
954NAME IS NULL:2012/03/11(日) 13:11:05.15 ID:???
実装が不明なのに、いきなり物理設計を語ってる
955946:2012/03/11(日) 13:11:49.10 ID:???
みなさん、すみませんでした。

>>946、947、948のおっしゃる通り、確かに質問スレじゃないので設計例も
出さずに丸投げしてるのは完全にスキル不足です。会社に人がいないので
いきなり設計からやらされて四苦八苦というか混乱したままです。

>>950
どうもありがとうございます。きちんとしたプロだとこう考えるんですね・・・

ところで、
> 「変える」という部分を「利用者の入力項目」であると解釈して設計した
ここは文言足らずですみませんでした。これは利用者ではなく貸出者側の制約です。

なので、
> 「ある期間では特定の時間枠に限って貸出を許可する」
ということです。特定期間だけ部屋を増やしてその部屋に特定時間枠を設けたい
という要求でした。
956NAME IS NULL:2012/03/11(日) 14:34:22.85 ID:???
本当はプロに外注したほうが安上がりなんだろうけど、そうすると>>946の存在価値がなくなってリストラされちゃうのか?
957950:2012/03/11(日) 16:29:04.79 ID:???
>>955
では、設計の楽な(=手抜きをした)>>950を改め、真面目に設計してみよう
設計の変更方針は、以下の2点
・貸出期間の表現方法を属性(フィールド)からエンティティ(テーブル)へと変更
・貸出期間を貸出期間テーブルと特定貸出期間テーブルとに分類して表現
【基本的な考え方(E-Rモデル)】
・テーブルは6つ定義する:
  (1) 利用者テーブル, (2) 部屋テーブル, (3) 貸出期間テーブル, (4) 特定貸出期間テーブル,
  (5) 貸出条件テーブル(関連テーブル), (6) 貸出テーブル(関連テーブル)
・貸出期間と特定貸出期間とは1:0/1関係、つまり部分集合関係(subset-of または kind-of)とみなす
・部屋と貸出期間との関係は、(関連テーブルである)貸出条件を介してm:n関係
・利用者と貸出条件との関係は、(関連テーブルである) 貸出を介してm:n関係
【各テーブルのフィールド定義】
・利用者テーブル -- (>>950と同じなので省略)
・部屋テーブル -- (>>950と同じなので省略)
・貸出期間テーブル
 ・貸出期間フィールド -- PK, 期間型, NOT NULL
 ・貸出期間区分フィールド -- 文字列型, NOT NULL, 値制約: "一般" または "特定"
   値が "特定" であれば、そのレコードが特定貸出期間であることを意味する
・特定貸出期間テーブル
 ・貸出期間フィールド -- FK, 期間型, NOT NULL, 参照制約: 貸出期間テーブル.貸出期間フィールド
 ・開始時間フィールド -- 時間型, NOT NULL
 ・終了時間フィールド -- 時間型, NOT NULL
・貸出条件テーブル(部屋と貸出期間との間の関連テーブル)
 ・部屋IDフィールド -- FK, 整数型, NOT NULL, 参照制約: 部屋テーブル. 部屋IDフィールド
 ・貸出期間フィールド -- FK, 期間型, NOT NULL, 参照制約: 貸出期間テーブル.貸出期間フィールド
・貸出テーブル(利用者と貸出条件との間の関連テーブル)
 ・利用者IDフィールド -- FK, 整数型, NOT NULL, 参照制約: 利用者テーブル.利用者IDフィールド
 ・部屋IDフィールド -- FK, 整数型, NOT NULL, 参照制約: 部屋テーブル. 部屋IDフィールド
 ・貸出期間フィールド -- FK, 期間型, NOT NULL, 参照制約: 貸出期間テーブル.貸出期間フィールド

(長いので続く)
958950:2012/03/11(日) 16:36:19.78 ID:???
(>>957の続き)

【補足】
・特定貸出期間テーブル
 ・フィールドの組 <貸出期間, 開始時間, 終了時間> に対してUNIQUE制約とし、複合キーを形成
 ・(一般)貸出期間の部分集合なのだから、(検索を除く)DBアクセス時には両者を操作対象とする
・貸出条件テーブル
 ・フィールドの組 <部屋ID, 貸出期間> に対してUNIQUE制約とし、複合キーを形成
・貸出条件テーブル
 ・フィールドの組 <利用者ID, 部屋ID, 貸出期間> に対してUNIQUE制約とし、複合キーを形成

最後に、設計が複雑になって文章だけでは把握しずらいと考えて、テーブル関連図をアップしといた
 http://www.h6.dion.ne.jp/~machan/misc/room-booking.png

>>955
>きちんとしたプロだとこう考えるんですね・・・

自分はRDB案件を扱うこともあるけど、DB設計の済んだのを実装する(下請けの)立場
まだDB設計は任せてもらえていない ....orz
とてもプロとはいえない立場だから、(設計レビューの気分で)ツッコミをキボン >>all
959NAME IS NULL:2012/03/11(日) 17:34:21.91 ID:???
安易に区分フィールドを入れたがる奴は、ほんとに設計が痛々しい
960946:2012/03/11(日) 18:30:47.41 ID:???
リストラされますた!
961NAME IS NULL:2012/03/11(日) 18:47:39.67 ID:???
>>960
正解
962NAME IS NULL:2012/03/12(月) 03:03:30.11 ID:???
>>946
条件が複雑なら >>949 の言う通りDB設計は単純にして、アプリ側を作り込んだ方が良いんじゃない?例えばテーブルは下記の3つ。

部屋(部屋ID,部屋名)
貸出枠(貸出枠ID,部屋ID,開始日時,終了日時)
貸出枠利用(貸出枠ID,利用者名)

あとは貸出枠の管理アプリで、貸出枠のテンプレートを使って一括追加できるようにするとか、
同じ貸出枠・時間帯をまとめて編集できるようにするとか、繰り返し作業を楽に実行できるようにしておけば?
963950:2012/03/12(月) 13:26:23.59 ID:???
>>962
そのDB設計には、貸出枠利用テーブルに一意性(identifier)が存在していないね

具体的には、貸出関連イベントが発生するたび、
常に貸出枠テーブルと貸出枠利用テーブルを追加/更新/削除しなければならないという問題
結局、意味としては以下のような2テーブル構成と同じになる
・部屋(部屋ID(PK), 部屋名)
・貸出枠(貸出枠ID(PK), 部屋ID(FK), 開始日時, 終了日時, 利用者名)

また、この2テーブル構成では(そして>>962にしても)、利用者名の情報が重複するという問題がある
これを(正規化によって)解決すると、以下の3テーブル構成になる
・部屋(部屋ID(PK), 部屋名)
・貸出枠(部屋ID(FK), 利用者ID(FK), 開始日時, 終了日時)
・利用者(利用者ID(PK), 利用者名)
964NAME IS NULL:2012/03/12(月) 14:50:02.06 ID:???
>>963
めんどくさいから最初しか読んでないけど、貸出枠IDがユニークなんでしょ。
965NAME IS NULL:2012/03/12(月) 17:05:07.71 ID:???
なんか良くわかんないけど、会議室の貸出システムとかなら実装例ググればいくらでも出てくるんじゃない?

でさ、大抵の場合時間枠は10分単位とか15分単位とかになってて、
部屋IDと時間枠で部屋を管理してダブルブッキング制御まではDB側で実装してる気がする。

10時05分から11時55分まで借りるとしても、10時から12時まで借りるとしても
貸す側も借りる側も大差ないでしょう。
966NAME IS NULL:2012/03/12(月) 17:39:15.29 ID:???
10分、15分刻みにすることについてDBとしては何のメリットもない
967NAME IS NULL:2012/03/12(月) 18:22:12.09 ID:???
>>965
>会議室の貸出システムとかなら実装例ググればいくらでも出てくるんじゃない?

それなら>>965がそのリンクでも紹介すればいいんじゃない?
968NAME IS NULL:2012/03/12(月) 19:12:03.17 ID:???
"会議室貸出システム" でググると4件しかないぜw
969950:2012/03/12(月) 19:39:29.52 ID:???
類似のキーワード "会議室予約システム データベース" でググってみたところ、
DB設計として>>946の参考になりそうなページをようやく1件だけ見つけた
 「情報処理試験.jp」平成14年 秋期 初級システムアドミニストレータ 問題と解答
 http://情報処理試験.jp/AD14b-pm/t02.html

【会議室予約システムのデータベースの構造】-- 注: PK/FKは推測で追記している
・会議室予約表(利用日, 会議室番号(FK), 開始時刻, 終了時刻, 社員番号(FK), 利用目的, 利用人数)
・社員表(社員番号(PK), 社員氏名, 部番号(FK), 内線番号)
・会議室表(会議室番号(PK), 会議室名, 定員)
・部署表(部番号(PK), 部名)
970NAME IS NULL:2012/03/12(月) 19:47:31.65 ID:???
つまりggrksということか
971NAME IS NULL:2012/03/12(月) 19:52:53.68 ID:???
>>966
開始時刻、終了時刻でやるのではなくて、時間をブロック単位にしてブロック毎に管理。
(そのブロックを1分単位のタイムスライスでもいいけど、10分か15分ぐらいが扱いやすい単位だろう。)
その時間ブロックのIDと部屋IDと日付を複合キーとすれば、ダブルブッキングを抑制できる。

972950:2012/03/12(月) 19:55:38.22 ID:???
>>964
>めんどくさいから最初しか読んでないけど、貸出枠IDがユニークなんでしょ。

そのとおりだね
貸出枠IDがユニークだから、貸出枠テーブルと貸出枠利用テーブルが重複している
>>962のDB設計には無駄があり、それを見直したのが>>963上段の2テーブル構成
973NAME IS NULL:2012/03/12(月) 20:38:27.76 ID:???
>>971
んー?
10分のブロックとして、2時間の予約を行うと12レコードできるってことかな。
それでやる場合、予約キャンセルをするときは12レコード削除するんだよね。
1時間の予約を二連続で行った場合との区別はどうするのかな。

普通に時刻で持たせて、
希望開始時刻 between 開始時刻 and 終了時刻 or 希望終了時刻 between 開始時刻 and 終了時刻
であるようなレコードがあればダブルブッキングでええんじゃないの。
974NAME IS NULL:2012/03/12(月) 20:41:52.96 ID:???
where句を間違えて非常に恥ずかしいわけだけど、汲み取っていただければと思う。
975NAME IS NULL:2012/03/12(月) 20:42:12.76 ID:???
>>971
ブロック管理する理由が理解できません
976962:2012/03/12(月) 21:17:41.60 ID:???
>>963
貸出枠と貸出枠利用を分けたのは下記の理由
1.枠と枠利用で追加・削除されるタイミング・入力者が違う(枠は計画時、枠利用は申込時)
2.枠と枠利用を分けて、操作を追加・削除のみ(更新不可)に制限すれば、枠利用がある枠の誤った更新・削除を防げる、行ロックも考えなくて済む
3.枠利用に他の列(利用申込日, 利用者電話番号など)が必要になったときに影響範囲を狭くできる、空列も減らせる
4.枠と枠利用の関係が1対1ならPK(貸出枠ID)、枠1つに複数利用ならPK(貸出枠ID, 利用者名)としても対応できる

利用者にIDを振ってないのは
1.利用者の追跡機能が必要かどうか分からないから
977NAME IS NULL:2012/03/12(月) 21:23:34.59 ID:???
>>950じゃないけども。
貸す側が枠を決める設計だったのね。
逆を言えば、借りる側が自由に時間を決められない、
もしくは、>>965が言うような、枠を小刻みに分割して登録しておくのかな。

特定日だけ使えるような場合には、前もって枠を作っておけばよくて、
常に使える部屋は日時バッチとかで枠作るのかな。
978NAME IS NULL:2012/03/12(月) 21:49:28.21 ID:???
もう釣られすぎだわ
979NAME IS NULL:2012/03/12(月) 22:07:55.06 ID:???
ワインバーグの本にはこういうのがよく出てくるよね。
980950:2012/03/12(月) 22:12:36.83 ID:???
>>976
つまり枠と枠利用との間には部分集合関係(全体-部分)ということか
特に前段の1. と 4. がポイントだね

後段の利用者についても、必要となった時に利用者テーブルを追加すればいいと

よく分かりました
>>963の指摘は、全面的に撤回します
981NAME IS NULL:2012/03/12(月) 22:27:10.31 ID:???
982962:2012/03/13(火) 03:44:45.40 ID:???
ここまでの流れを読んで考え直してみたら >>962 の設計も変だったので次のように修正。

部屋(部屋ID, 部屋名)
貸出枠(貸出枠ID, 部屋ID, 開始日時, 終了日時)
予約(予約ID, 予約者名)
予約貸出枠(予約ID, 貸出枠ID)

>>965 のように分割して登録するなら 予約貸出枠(貸出枠ID) にユニーク制約を付けて検証
>>977 のように借りる側が時間指定するなら 予約貸出枠(予約ID, 貸出枠ID, 開始日時, 終了日時) として
 追加時に貸出枠の期間内か、他の同じ貸出枠IDの期間と重なっていないかを検証

>>962 はリソース(貸出枠)とイベント(貸出枠利用)がIDを共有しているから意図が不明瞭になってた(ごめん >>950)
 あと、同じ利用者が複数枠を同時に予約した場合にデータの重複が発生していた。
983NAME IS NULL:2012/03/13(火) 03:52:25.67 ID:???
>>973
>それでやる場合、予約キャンセルをするときは12レコード削除するんだよね。
運用では削除・挿入よりも参照の方が多い。スピードを考慮するならむしろ参照側だろう。
枠で管理してると、SQLだけで部屋毎、時間帯毎の予約状況をグラフ的に表示可能。

>1時間の予約を二連続で行った場合との区別はどうするのかな。
貸出枠テーブルに件名入れれば1時間の予約を二連続で行った場合との区別は可能。

>普通に時刻で持たせて、 (ry
WHERE句で扱えるような条件を制約として持てないDBエンジンも存在する。
その場合でも時間ブロックのID使えば制約として扱えるから
DBエンジンレベルでダブルブッキング防止が可能。
984983:2012/03/13(火) 03:54:21.10 ID:???
訂正 ×グラフ的 ○一覧表 
985950:2012/03/13(火) 17:25:18.78 ID:???
>>982
>>>962 はリソース(貸出枠)とイベント(貸出枠利用)がIDを共有しているから意図が不明瞭になってた

え、>962はイベント(貸出枠)とイベント(貸出枠利用)とがサブセットである(=部分集合関係にある)と
>>980で解釈した、つまり「貸出枠の役割はイベント」と考えて納得できたのだけれど、
それも誤りだったのかなあ....
まあ過ぎた話だから、>>962についてはどちらでもいいかw

で、>>982についても同様に、リソース/イベントというテーブルの役割という観点で分類してみる
・部屋 - リソース
・貸出枠 - 管理者が枠を「割り当てる」というイベント
・予約 - 利用者が部屋を「予約する」というイベント
・予約貸出枠 - 貸出枠と予約というイベント間の対応表(関連テーブル)
さて、これは(>>982の意図を)正しく解釈したものになっているかな?
986NAME IS NULL:2012/03/13(火) 18:33:22.24 ID:???
イベントとリソースでテーブル分けるとか、イベントって何でリソースって何?
イベントに付帯する情報はリソースとみなさないってっことなのか?


モデリング論争としては意味があるかもしれんが、実際のシステム構築するなら
>>946程度の要件でDB設計するとか無理だがな
987950:2012/03/13(火) 19:31:05.46 ID:???
>>986
>イベントとリソースでテーブル分けるとか、イベントって何でリソースって何?

E-Rモデル(概念モデル)をリレーショナルデータベース(論理モデル)へ落とし込む、
いわゆるDB設計の際に、E-Rモデル上のエンティティをリソースとイベントに分けるというのが
最初の一歩になると考える

具体的には、あるエンティティについて以下の考え方で分けている
・「...する」という動詞句で意味が通じればイベント
・それ以外はリソース
あくまで目安だけどね
場合によっては、E-Rモデルの設計までさかのぼって再検討する、つまり
要求仕様からE-Rモデルへの落とし込みである概念モデル設計のミスを疑うことも考える必要がある

>イベントに付帯する情報はリソースとみなさないってっことなのか?

付帯という言葉は単一方向な関係を表す概念だけど、E-Rモデルにおいては(E-Rモデルからは)、
「リソースがイベントに付帯する」のかそれとも「イベントがリソースに付帯する」のかを
一意に決めることはできない
イベントとリソースは相対的で双方向な関係であると思う

ただし、イベント間の関係についてはイベント発生に時系列があるから単一方向な関係であり、
「あるイベントがもう一つのイベントに付帯する」ことはありえる
たとえば、受注イベントと請求イベントは必ず「受注->請求」という時系列で並ぶから、
「請求(イベント)は受注(イベント)に付帯する」と解釈する(=みなす)ことができる
だから、エンティティをイベントと(それ以外の)リソースへと分類することが大切になる
988NAME IS NULL:2012/03/13(火) 19:43:46.70 ID:???
ごちゃごちゃと書いてるが結局のとこ、イベントとリソースってのは
ERモデルのエンティティの種類
ってことしか説明できてないぞ

>イベントとリソースは相対的で双方向な関係
>イベント間の関係については(略)単一方向な関係
>だから、エンティティをイベントと(それ以外の)リソースへと分類することが大切になる
この説明だと単一方向な関係をもつものを区別するのが大事だって事になるがそれでいいのか?
989950:2012/03/13(火) 19:58:13.79 ID:???
>>988
>ごちゃごちゃと書いてるが結局のとこ、イベントとリソースってのは
>ERモデルのエンティティの種類ってことしか説明できてないぞ

まさにそのとおりだよ
イベントとリソースとはエンティティの種類に付けた言葉(名前)でしかない

>この説明だと単一方向な関係をもつものを区別するのが大事だって事になるがそれでいいのか?

これも、その理解で合っているよ
単一方向な関係を持つイベントを(それを持たないリソースと)区別するのが大事になる
990962:2012/03/13(火) 21:37:51.98 ID:???
>>985
貸出枠はリソース。販売管理で例えるなら 貸出枠=商品、予約=受注。
>>962 も販売管理で例えるなら 商品(商品ID), 商品受注(商品ID, 販売先) となって、違和感があるから >>982 とした。

貸出枠を生産したイベントテーブル(貸出枠割当とか)があっても良いけど
(他のリソースを増減させるわけでもないし、外部との契約ってわけでもないので)今の所、作る価値が思い当たらず、省いた。
991950
>>990
了解しました
エンティティの分類方法に相違(貸出枠はリソース?それともイベント?)があっても
結果は同じになるので、そういった考え方もアリだと思います

で、早速>>982のDB設計を元にしたテーブル関連図をアップしときました
 http://www.h6.dion.ne.jp/~machan/misc/room-booking-982.png