トップページ⇒db
1002コメント371KB

DB設計を語るスレ 8 [転載禁止]©5ch.io

レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL2015/02/18(水) 18:09:10.83ID:cm3dXkF1
語れ

前スレ
DB設計を語るスレ 7
http://peace.2ch.net/test/read.cgi/db/1386312737/
0002NAME IS NULL2015/02/18(水) 18:40:45.29ID:???
過去スレ
DB設計を語るスレ 6
http://toro.2ch.net/test/read.cgi/db/1341061787/

DB設計を語るスレ 5
http://toro.2ch.net/test/read.cgi/db/1331558806/

DB設計を語るスレ 4
http://toro.2ch.net/test/read.cgi/db/1309828440/

DB設計を語るスレ 3
http://hibari.2ch.net/test/read.cgi/db/1269585561/

DB設計を語るスレ 2
http://pc11.2ch.net/test/read.cgi/db/1223458453/

DB設計を語るスレ
http://pc11.2ch.net/test/read.cgi/db/1166540159/
0003NAME IS NULL2015/02/18(水) 18:41:48.58ID:???
関連スレ

何故データベース設計は軽視されるのか?
http://toro.2ch.net/test/read.cgi/db/1228061247/

頼むから正規化しろよ 第二正規形
http://toro.2ch.net/test/read.cgi/db/1116097001/

【より良い】データモデリング【モデルを】
http://toro.2ch.net/test/read.cgi/db/1057509675/

T字形ER(TM)ってどうよ?
http://toro.2ch.net/test/read.cgi/db/1156946197/
0004NAME IS NULL2015/02/18(水) 18:42:43.90ID:???
http://peace.2ch.net/test/read.cgi/db/1386312737/999
複数の課金情報を一括で請求するという話らしいよ
0005NAME IS NULL2015/02/18(水) 18:47:56.97ID:???
>>4
悪いんだけど、もう一回前スレ989-991を読み返して。

あと>>1乙
0006NAME IS NULL2015/02/18(水) 19:05:24.42ID:???
ああ、ごめん。
そうだね。
http://peace.2ch.net/test/read.cgi/db/1386312737/928
は、そういう主張をしている人だよ。
0007NAME IS NULL2015/02/18(水) 20:09:41.39ID:???
まだやってるのかよ、ちょっとキモいわ
0008NAME IS NULL2015/02/18(水) 21:28:48.64ID:???
>>7
そんなレス書くやつのほうが、よっぽど…
0009NAME IS NULL2015/02/18(水) 22:56:42.75ID:???
> 常にサービステーブルの金額が課金金額と請求金額になるなら、課金金額と請求金額は不要
> (変わる例としては、特定ユーザーのみ割り引くとか、キャンペーン中なので請求金額のみ割り引くとか
> あと途中で値上げ/値下げした時に、その切り替わりの処理を考慮する必要がある(サービステーブルそのまま書き換えると、課金した時と請求する時で金額が違うとかなるから))

これ、俺ならそういう課金レコードを別に作ると思うんだけど、それって変な発想なのかな
0010NAME IS NULL2015/02/19(木) 00:01:09.32ID:???
こんなとこで聞いちゃうなんてIT屋向いてないから別業種に転職活動する
が正解
0011NAME IS NULL2015/02/19(木) 01:48:21.53ID:???
前スレ>>996
俺は>>952を不支持
統一するか分けるかは仕様によるとしか言えん
特に分ける理由が無ければ統一でいいでしょ
0012NAME IS NULL2015/02/19(木) 11:01:20.92ID:???
>>11
> 特に分ける理由が無ければ統一でいいでしょ
ひとつにまとめるのが普通な人は、そう思うんでしょう。
分けるのが自然と考える人は、特に結合する必要がなければ結合しない、ということになる。

> 統一するか分けるかは仕様によるとしか言えん
何をエンティティにするかということに関して、仕様が影響するのは事実だけど、
社会通念上別物なら別エンティティだと考えるのも自然だと思う。そして、俺はそっち派。

さらに今回はイベント発生トリガーに時間的差異がある、1:1ではなくて1:0..1の場合の話だから、
それが結合しない方が良い理由の一つにもなる。NULL撲滅委員会的に。
0013NAME IS NULL2015/02/19(木) 14:19:49.82ID:???
>>9
> これ、俺ならそういう課金レコードを別に作ると思うんだけど、それって変な発想なのかな

課金テーブルがあるという前提で、請求金額の帳尻を合わせるために課金が発生していないにも
かかわらず課金レコードを追加すると、後々禍根が残りかねない。

俺なら、請求明細テーブルを作って、対象となる課金レコードに対応するレコードと、割引など
レコードを作って、SUM(請求明細.請求金額)が請求合計金額になるようにするな。
0014NAME IS NULL2015/02/19(木) 15:13:36.48ID:???
>>13
普通そうだわなぁ
0015NAME IS NULL2015/02/19(木) 16:11:55.94ID:???
>>13
ごめん、サービスレコードと書くところを課金レコードと書いていたようです。
課金サービスはそのままにして割引サービスレコードを追加するというのはなるほどでした。
どもです。
0016NAME IS NULL2015/02/19(木) 16:58:01.05ID:???
もう一度要件をまとめよう。

・会員が利用したサービスに対して月額料金を請求する
・会員が利用したオプションサービスに対して料金を請求する
・オプションは何度も追加される可能性あり
・月末締め、翌月指定日に請求メールを送信する
・会員は振込方法を選べる
・管理者が確認したら利用継続。未払いなら停止

こういうのはWebサービスでよくあるよな?レン鯖とか携帯の契約もそうだ。
今や机上の空論的な論争になってるが、こういう想定で設計を考えたらどうだ?
0017NAME IS NULL2015/02/19(木) 17:04:08.73ID:???
>>16
そんなの誰が設計したって似た感じになるだろ、

って思ってたんだが、ひとつにまとめるべき派が出てきて驚愕した。
0018NAME IS NULL2015/02/19(木) 17:42:50.86ID:???
しかもひとつにまとめるべき派の理屈がよくわからない
0019NAME IS NULL2015/02/19(木) 17:50:53.88ID:???
今回のことで、「はぁ?なんで結合してんだよ?」って思ったとき、相手は「はぁ?なんで分割するんだよ?」って
思ってるんだろうってことがわかった。
0020NAME IS NULL2015/02/19(木) 20:28:30.21ID:???
俺は分ける派だが
エンティティ数やテーブル数は出来るだけ減らすのが正義だとする人に合った事はある
仕様書のページ数やプログラムのステップ数で値段決まってた時代の人かと思ったぜ
0021NAME IS NULL2015/02/19(木) 23:42:08.07ID:???
テーブル数多いほうが仕様書増えていいじゃん
0022NAME IS NULL2015/02/20(金) 00:30:48.55ID:???
分ける数が多いとJOINするケースも増えるから、SQLがややこしくなってバグが増えるから嫌だって気持ちはわかる。
0023NAME IS NULL2015/02/20(金) 00:43:06.87ID:???
そういうときこそViewを使えば良いのでは?
0024NAME IS NULL2015/02/20(金) 01:09:41.62ID:???
>>23
性能落ちるやん

昔ステータスが変わるごとにテーブル項目全コピー
マスタの内容は時点の内容を横持ちってシステムを担当して驚いたけど
データ量は増えるけど処理は簡単だし1手前に戻れるとかいろいろ勉強になった
0025NAME IS NULL2015/02/20(金) 01:38:35.39ID:???
ボイスコッド正規形近くまで分けるのってデータの更新時間が重要なときで、検索が大事なときは第三正規形よりなきがする
0026NAME IS NULL2015/02/20(金) 02:45:43.25ID:???
>>12
1で済む物をわざわざ分ける理由は?
社会通念上?
正規化と全然関係無い(笑)
0027NAME IS NULL2015/02/20(金) 08:38:33.86ID:???
そりゃ、エンティティ‐リレーションシップによる設計と正規化は直接関係ないだろう。
0028NAME IS NULL2015/02/20(金) 10:16:14.93ID:???
>>26
論理設計におけるエンティティ抽出の話だよ。
一般的に考えて、別々の業務で発生する事象を、論理設計段階で別物として扱うということ。

ところで、申請と承認を扱うシステムがあったら、それも一つにまとめるのか?
0029NAME IS NULL2015/02/20(金) 10:33:24.42ID:QgK6W0g0
カテゴリの登録のさせ方で悩んでいます。要件は
・1ユーザーがメインカテゴリ、サブカテゴリの2階層まで登録できる
・階層が増えるケース(3階層になるとか)は無い
・データ表示画面でサブカテゴリ名を常に表示したい(食べログとかのポータルサイトのイメージ)

■共通テーブル
□ユーザーテーブル
ID|ユーザー名

□カテゴリテーブル
ID|親ID|カテゴリ名|順番

■考え中のAパターン(中間テーブルをもちいて、2レコード登録)
□ユーザーカテゴリテーブル
ID|ユーザーID|カテゴリID

■考え中のBパターン(ユーザーテーブルを変更してカテゴリIDを追加)
□ユーザーテーブル
ID|メインカテゴリID|サブカテゴリID|ユーザー名


A・Bどちらにすれば良いか悩んでいます。
正規化や汎用性の高さからはAでしょうが、出力時にSQLコストがかかります。
プログラムで再帰しながら何とかする方法もあるのでしょうが・・。
かといってBだと汎用性がなさすぎるので、仮に「1ユーザー2カテゴリ登録させたい」だと詰みます。

皆様のご意見をお願いします。
0030NAME IS NULL2015/02/20(金) 11:18:08.17ID:???
>>29
食べログとかのポータルサイトを全然知らないからイメージがわかない。

> □カテゴリテーブル
> ID|親ID|カテゴリ名|順番
は決定項目なのが前提みたいだけど、この構造を変えるっていう案もあるのでは。
0031NAME IS NULL2015/02/20(金) 13:32:54.98ID:???
再帰ってどこに出てくるんだ?
0032NAME IS NULL2015/02/20(金) 13:44:46.51ID:???
>>29
カテゴリのメインとサブの区別がよくわからん
>・1ユーザーがメインカテゴリ、サブカテゴリの2階層まで登録できる
この言い方だと、メインかサブかはユーザーの指定によって決まるように見える

メインに出来るカテゴリ、サブに出来るカテゴリ、メインとサブにできる関係
このあたりの条件をはっきりさせた上で

ユーザが登録できるメインカテゴリ数とサブカテゴリ数の上限(と下限)
をはっきりさせんと何も決まらん
0033292015/02/20(金) 14:08:55.50ID:???
>>32
分かりづらくてすみません。

□カテゴリーテーブル
ID|親ID|カテゴリ名|順番
1 |NULL|和食|1
2 |NULL|中華|2
3 |1   |寿司|1
4 |2   |ラーメン|1

こういうカテゴリが入ってるとします。
1ユーザーは「和食>寿司」という選択が出来るイメージです。
1人1カテゴリ(メイン内のサブカテゴリ1つを選択)という意味です。
0034NAME IS NULL2015/02/20(金) 14:45:35.93ID:1Av/MwJL
メインカテゴリしか登録しないユーザーがいそうだね。
2階層がそのうち3階層以上に拡張したくなるかもしれない。
ユーザーが複数のカテゴリを使いたくなるかもしれない。
対応しやすさから言うと、上の方かな。
0035NAME IS NULL2015/02/20(金) 14:50:37.44ID:???
ユーザが選択できるのがサブカテゴリだけなら、例えば、

□親カテゴリーテーブル
ID|カテゴリ名|順番
1 |和食|1
2 |中華|2

□サブカテゴリーテーブル
ID|親ID|カテゴリ名|順番
1 |1   |寿司|1
2 |2   |ラーメン|1

□ユーザーカテゴリテーブル
ID|ユーザーID|サブカテゴリID

という構造にすることもできるのだが。
0036NAME IS NULL2015/02/20(金) 14:53:18.91ID:???
そもそも、ユーザは何のためにカテゴリを選択するんだ?
そして、その選択されたカテゴリはどこに使われるんだ?
0037NAME IS NULL2015/02/20(金) 15:10:52.05ID:???
>>29
> 出力時にSQLコストがかかります。
AとBで一体どれくらいコストの違いがあると思ってる?

> プログラムで再帰しながら何とかする方法もあるのでしょうが・・。
どこに再帰の必要があるんだ・・・。

> かといってBだと汎用性がなさすぎるので、仮に「1ユーザー2カテゴリ登録させたい」だと詰みます。
ん?
□ユーザーテーブル
ID, メインカテゴリID, サブカテゴリID, ユーザー名
1, 1, 1, user name1
2, 1, 2, user name1
3, 1, 1, user name2
登録できるけど?
0038NAME IS NULL2015/02/20(金) 15:12:30.76ID:???
あ、ひょっとして「ユーザーテーブル」というのは、いわゆる「ユーザマスタ」のことで、
氏名とかメールアドレスとかパスワードとかが登録されてる奴か?
だったら、Bパターンはないわー。
0039NAME IS NULL2015/02/20(金) 15:18:44.83ID:???
再帰問い合わせができないRDBMSで、なおかつ階層が3階層以上あるというなら、カテゴリの実現方法に
悩むのもわかるが、2階層までしかないなら
> □カテゴリテーブル
> ID|親ID|カテゴリ名|順番
>
> □ユーザーカテゴリテーブル
> ID|ユーザーID|カテゴリID
でいいでしょ。

それともあれか?
たかだか1:1にしかすぎないから、全部まとめるのはどうかとか、そういう話か?
0040292015/02/20(金) 17:37:47.54ID:???
>>39
今、Aパターンでパフォーマンステストしていますが、
おっしゃるように再帰問い合わせできずにサブクエリだらけになるので、重くならないかと・・。
もちろん要件次第なのはその通りなのですが、見極めが難しいところです
0041292015/02/20(金) 17:42:39.67ID:???
ちなみに>>33では分かりやすく飲食のカテゴリにしましたが、
目的はユーザーのグループ(所属)分けです。
ID|名前|メインカテゴリ名|サブカテゴリ名
みたいな感じで一覧表示が目的です。

この形のSELECTを実行するにはAパターンだとサブクエリしまくりが発生します。
どの程度パフォーマンスに影響が出るかは調査中ですが。
0042NAME IS NULL2015/02/20(金) 17:43:33.80ID:???
何を見極めようとしているのか、理解に苦しむ。

> サブクエリだらけ
って、カテゴリの部分はカテゴリテーブルをJOINするだけでしょ?
0043NAME IS NULL2015/02/20(金) 17:45:16.07ID:???
絶望的に説明が下手
0044NAME IS NULL2015/02/20(金) 17:50:35.91ID:???
グループ分けって何だよ?
メインカテゴリでグルーピングするのか、サブカテゴリでグルーピングするのか。
0045NAME IS NULL2015/02/20(金) 17:55:48.84ID:???
>>33
カテゴリという言葉が、メインカテゴリ、サブカテゴリ、メインサブの系統
あたりの区別が出来ずに使われてるのが問題

>メインに出来るカテゴリ、サブに出来るカテゴリ、メインとサブにできる関係
何一つとしてはっきりしてないのだが
本人もなんとなくでしか理解してないんだろうけど、一度条件をはっきり書きだしてみたら

ユーザーが指定するのはサブカテゴリを一つだけで良いのか?
その場合
サブカテゴリは必ず親カテゴリをもってるのか?
それは(ユーザーに無関係に)一意にきまるのか?

そのカテゴリマスタの構成で考えられるのは、メインとサブに厳密な区分はない場合だ
(機械構成部品のように、見方によっては親だが違う見方では子になるような)

その場合はサブを指定するって考え方はおかしい
0046NAME IS NULL2015/02/20(金) 18:20:09.10ID:???
>>29
プログラマはね、記述された仕様をきっちり読むものなんだよ。
だから、
> ・1ユーザーがメインカテゴリ、サブカテゴリの2階層まで登録できる
「2階層まで」とあったら、
・カテゴリ未登録
・メインカテゴリのみ登録
・メインカテゴリ・サブカテゴリの両方を登録
って読む。(読まない人もいるだろうが)

まず、この理解は正しいかどうかだけでも教えてくれ。

で、もし正しいなら、グルーピングは何を対象に行うのか教えてくれ。
0047NAME IS NULL2015/02/20(金) 18:36:32.80ID:???
話が全然進まないので、実際にテーブルを作ってみた。
これでいいのかどうか教えてくれ。

table users: {id, name}
1;"user1"
2;"user2"

table categories: {id, parent_id, name, seq}
1;;"和食";1
2;;"中華";2
3;1;"寿司";1
4;2;"ラーメン";1

table user_category {user_id, category_id}
1;3
2;4

select u.id as user_id,
u.name as user_name,
c1.name as main_category,
c.name as sub_category_name
from user_category uc
join users u on u.id = uc.user_id
join categories c on c.id = uc.category_id
join categories c1 on c1.id = c.parent_id;

1;"user1";"和食";"寿司"
2;"user2";"中華";"ラーメン"
0048292015/02/20(金) 19:32:43.06ID:???
>>45-47
1度の登録でメインカテゴリ、サブカテゴリを必ず登録します。

例)
Aさんは「和食(メイン)」の「寿司(サブ)」を選択した。
Bさんは「中華(メイン)」の「ラーメン(サブ)」を選択した。

というイメージですので、>>47さんの場合は
table user_category {user_id, category_id}
1;1
1:3
2;2
2:4

になります。
メインカテゴリだけ検索して、絞り込み検索でサブカテゴリまで抽出したいので、
上記のような入力方法になると思っています。

ただ、>>47さんのSQL文を見ると、自分の考えが間違っている気がしてなりません・・。
自分ではこれほど短いコードは書けません。サブクエリだらけだったので。

もう少し勉強してみます。皆さん、説明不足なのにアドバイス頂き、ありがとうございました。
0049NAME IS NULL2015/02/20(金) 19:40:09.96ID:???
>>48
シンプルに考えればええんよ。
サブがわかればメインは引っ張ってこれるよね。という話。
0050292015/02/20(金) 20:44:35.37ID:???
>>49
改めて感謝させてください。>>48のSQL文、凄いですね!
単純結合でここまでスマートに、シンプルに出来ると思いませんでした。

そして、メインカテゴリ・サブカテゴリと2つ登録しなくても
メインだけ、サブだけで絞り込み検索できますし、完璧だと思います。
パフォーマンス的にも全く問題無いです。かなり速いです。

自分が勉強した範囲では、>>48のように2つ登録する方法が中間テーブルとして正しいと学んだので、
本当に目から鱗というか、驚きでした。自分の中でDBに対する世界観が変わったような衝撃です。

自分の足りない情報でここまで丁寧に・確実にご回答いただけ、申し訳ない限りです。。
本当に本当に勉強になりました。貴重なアドバイスをありがとうございました。
0051492015/02/20(金) 20:58:29.37ID:???
感謝するなら>>47に。俺横レスだし
0052292015/02/20(金) 21:12:37.03ID:???
すみません。返信番号間違えました。>>47のSQL文です。
これは凄すぎます。自分のSQL史を塗り替える衝撃です。
本当にありがとうございました。
0053NAME IS NULL2015/02/21(土) 02:05:42.60ID:???
そんなに衝撃を受けるほどだったのか。
むしろもともとどんなクエリを書いていたのか見てみたい
0054NAME IS NULL2015/02/21(土) 02:23:11.15ID:???
>>28
論理設計?実装の話だよ

>>ところで、申請と承認を扱うシステムがあったら、それも一つにまとめるのか?
要件次第だろ(笑)
0055NAME IS NULL2015/02/22(日) 09:41:18.84ID:+W519OeW
>>53
join使うなと言うアホが未だにいるしな
で、ぼこぼこ同じ値保持しまくるテーブルが出来てどこが正しいの〜?ってなる
0056NAME IS NULL2015/02/22(日) 10:06:55.97ID:???
> join使うなと言うアホが未だにいるしな

    \エーーーーーーーッ!?/   ,,、,、,,,   
   ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ 
   (    )    (     )   (    )    )
0057NAME IS NULL2015/02/22(日) 10:24:23.91ID:???
join句変な書き方してるせいでクソ重いクエリとか書いた奴殴りたくなる
そういうバカのせいで使用が制限されてるようなもんだしな
0058NAME IS NULL2015/02/22(日) 10:31:43.44ID:???
設計段階でjoinを省くなよ
0059NAME IS NULL2015/02/22(日) 11:13:08.38ID:???
>>57
結合順ならわかるが書き方で重くなる?
今ちょっとはまってるので、教えろください
0060NAME IS NULL2015/02/22(日) 17:47:17.60ID:9nhB2Xgl
レン鯖によくある「月額利用でいくら」「オプション追加したらいくら」というDB設計を勉強しています。
月額料金はプラン毎に金額や使用範囲・条件が変わって、
オプションはドメイン追加とかメールアカウント追加とかそういうのです。
(ちなみにレン鯖を運営しているわけでも運営するつもりでもありません)

当初は、料金プランテーブルとオプションテーブルの2つを作ればいいと思ったのですが、
「プランによって使用範囲が変わる」「オプションによっても使用範囲が変わりそう」との想定から、
基本的なのは1つのテーブルにまとめて、以下のように正規化することを考えました。

◯料金テーブル(ID、プラン名、価格、識別コード)
1|格安プラン|500|plan
2|独自ドメイン|3000|option

◯料金設定テーブル(料金ID、設定名、設定値)
1|initial_cost|3000
1|capacity|10737418240
※格安プランの初期費用は3000円、使用可能容量は10GBという意味

この設計についてどう思いますか?足りない情報があればツッコミお願いします。
0061NAME IS NULL2015/02/22(日) 18:36:13.85ID:+W519OeW
>>59
join使うと遅いから使うなと言ったアホはインデックスを知らなかった
0062NAME IS NULL2015/02/22(日) 18:50:52.72ID:???
>>61
そんな情報はどうでもよくて、joinの書き方が変なことでクソ重くなる例がほしいんだと思う
0063NAME IS NULL2015/02/22(日) 20:01:49.52ID:???
>>62
インデックスの無い列でjoinしたら遅かったとか
そういう、書き方と関係ないレベルの話だったオチなんじゃないかと思うんだが

結合順とか今時のオプティマイザなら入れ替えるぞ
0064NAME IS NULL2015/02/23(月) 00:25:06.04ID:???
そうだからこそ、>>57に詳細を教えてほしいんじゃないの。
知らないトラップが潜んでるかもしれないという不安感
0065NAME IS NULL2015/02/23(月) 04:40:25.42ID:???
>>64
まあ一般的にそんな話があるなら俺も聞いてみたいが

特定のRDBMSで特定のバージョンで書き方によって
オプティマイザが変な判断するって話は聞いたことあるけど
詳しい中身は忘れたわ。バグとしてさっさと修正されたし
0066472015/02/23(月) 14:28:43.85ID:???
問題解決の糸口になってよかったよ。

やっぱ、日本語であれこれ質問するより、コード(SQL)書いた方が速いのかな。
面倒なんで、いつもは書かないんだけど。
0067NAME IS NULL2015/02/23(月) 22:22:49.03ID:???
>>66
ここの住民的言語難易度
日本語>>>>SQL
日本語がいいのはそもそもSQL知らない奴
0068NAME IS NULL2015/02/23(月) 23:15:56.66ID:???
ここSQLの書き方レベルの話するスレじゃないだろ
0069NAME IS NULL2015/02/24(火) 06:19:21.74ID:???
話す内容のレベルは低いよ
0070NAME IS NULL2015/02/24(火) 13:49:29.51ID:???
ひとつにまとめるべき論とか
0071NAME IS NULL2015/02/24(火) 15:40:45.79ID:???
いやそれこそDB設計論じゃねーの?
0072NAME IS NULL2015/02/24(火) 16:27:16.40ID:???
そうだね。
通常分割するものをあえてひとつにまとめることで生まれるメリットがあることもわかるので、
そのあたりを主張してほしかったなと思う。
普通まとめるでしょというスタンスだったので話はうまく進まなかったね。
0073NAME IS NULL2015/02/24(火) 19:14:12.04ID:???
普通まとめるでしょは、COBOLerの発想
0074NAME IS NULL2015/02/24(火) 20:46:17.93ID:???
正規化とは
0075NAME IS NULL2015/02/24(火) 23:23:42.50ID:???
特に分ける理由がないなら纏めて良いが、
普通は纏めるでしょになったのな(笑)
0076NAME IS NULL2015/02/25(水) 10:11:36.33ID:???
「纏める」というからには、それぞれは分かれている(別になっている)ものだという認識があるはず。
特に理由がなければ纏めずにそのままにしておく、というのが自然だと思うんだが。
0077NAME IS NULL2015/02/25(水) 12:48:56.88ID:???
JOINを知らないか、知ってるけどとんでもなくコストがかかるもんだと思い込んでるんじゃないのかな<まとめるべき派
0078NAME IS NULL2015/02/25(水) 13:20:09.67ID:???
纏めるべき派の奴が、俺のがふつーとか思ってそうなのが痛い
0079NAME IS NULL2015/02/25(水) 13:20:43.03ID:???
まとめる派はまともな理由もメリットも提示できてなかったんだから
これ以上言っても無駄だろ

次の話題どうぞ
0080602015/02/25(水) 16:48:10.22ID:???
すみませんが、>>60の設計についてご意見いただけないでしょうか。。
0081NAME IS NULL2015/02/25(水) 17:03:39.07ID:???
>>80
悪いけど、駄目すぎて説明するのがだるい
0082NAME IS NULL2015/02/25(水) 17:14:37.31ID:???
>>80
>足りない情報があればツッコミお願いします
情報足りなさすぎてツッコミすらできない

料金設定テーブルが何を持ってるテーブルなのかわからんから
どういう要件でそのテーブル構成になったのかすら読み取れんわ
0083812015/02/25(水) 17:20:43.41ID:???
まあ、あんまりなんでちょっとだけ言うと、なんで
> レン鯖によくある「月額利用でいくら」「オプション追加したらいくら」というDB設計を勉強しています。
とかしてるのか知らないけど、データベースのモデリングを勉強したことないでしょ。
その手の書籍を先に読むべき。

> ◯料金設定テーブル(料金ID、設定名、設定値)
> 1|initial_cost|3000
> 1|capacity|10737418240
> ※格安プランの初期費用は3000円、使用可能容量は10GBという意味
とかありえない。
0084812015/02/25(水) 17:22:54.01ID:???
まあ、ありえないとか言ったけど、そういうふうにテーブル作ってコードで頑張るならそれでもいいけど。
誰にも迷惑かからないし。
0085NAME IS NULL2015/02/25(水) 17:28:47.69ID:???
どうありえないか教えない辺り、相変わらずの展開になる予感
0086812015/02/25(水) 17:50:02.51ID:???
うわ、やっぱ一切レスすべきでなかったわ。
0087NAME IS NULL2015/02/25(水) 17:51:18.70ID:???
そのレスすらいらないと思うよ。暇なのは十分わかるんだけど。
0088NAME IS NULL2015/02/25(水) 17:59:22.40ID:???
纏める纏めないのつまんない話ばっかで、ちょっと何か書きたくなったんだよ。
以降、自重するので許してくれ。
0089602015/02/25(水) 18:10:44.53ID:u2pW+KJN
>>82
>>60に書いた情報で足りると思ったのですが、説明不足ですみません・・。
サービスによって設定項目が変わる場合、その都度テーブルを作るのはどうか?と思い、
料金設定テーブルを構想しました。

>>83-84
WordPressを参考にしてコードで識別する方法を考えたのですが、
ありえないとの事で、勉強不足で申し訳ありません。

みなさん、スレ汚し申し訳ありませんでした。もう少し勉強してから質問します。
回答してくれた方々、ありがとうございました。
0090NAME IS NULL2015/02/25(水) 18:29:59.03ID:???
>>89
横から補足すると、料金設定テーブルが何故駄目なのかというと、設定名によって設定名の意味が変わってくるため。
例えば、料金設定テーブルに
1|domain_cost|5000
というレコードがあって、「格安プラン、ドメイン追加」の初期費用を計算しようとしたら、capacityの行が邪魔になって簡単なクエリでは金額が計算できない。

これは、超有名なアンチパターン。
同じテーブルに複数の意味の別の情報を登録してはならない。
0091NAME IS NULL2015/02/25(水) 21:17:56.28ID:???
>>89
コードで識別するのはいいけど、設定名って何?2レコードにするまでもないだろこんなの
まず最低限第三正規形まで勉強してこい
0092NAME IS NULL2015/02/25(水) 21:40:20.38ID:???
突っ込みどころはそこじゃないだろ
0093NAME IS NULL2015/02/25(水) 21:48:02.94ID:???
そこもだろ
何がしたくてこうなってるのか分かんねーから、疑問に思ったこと全部聞いていくしかない
0094NAME IS NULL2015/02/25(水) 22:14:23.52ID:???
第三正規形じゃないというなら候補キーの真部分集合か他の非キー属性に関数従属する
非キー属性が存在するということなんだが。(第一正規形はこの際置いておくとして)
>>60のテーブルのどこのことを言っている?
0095NAME IS NULL2015/02/25(水) 23:42:03.94ID:???
このスレは底辺多いわ
0096NAME IS NULL2015/02/26(木) 08:39:59.52ID:???
単に設計がよくないという意味で「正規化されてない」という言葉を使っているように
見える人はこの板にもよくいるね。
0097NAME IS NULL2015/02/26(木) 13:14:11.12ID:???
お里が知れる
0098NAME IS NULL2015/02/26(木) 16:01:43.59ID:???
>>93
> 何がしたくてこうなってるのか分かんねーから、疑問に思ったこと全部聞いていくしかない

このスレは、ド素人を育ててあげるスレではありません。
0099NAME IS NULL2015/02/26(木) 17:33:17.98ID:???
>>98
こういう「俺は素人じゃない!」と思ってる子が一番かわいい
0100NAME IS NULL2015/02/26(木) 18:22:29.14ID:???
最近煽るだけの奴増えたな
0101NAME IS NULL2015/02/26(木) 23:51:17.20ID:???
>>60
まず基本的なところから指摘すると、正規化という技法は
DB設計における論理設計フェーズで「最適化」を目的として用いられるもの
だから正規化うんぬんを検討するには、概念モデルから正しく導出した
初版の論理モデルが必要になる
残念ながら >>60 の設計内容を見るに、
  「概念モデルから初版の論理モデルを正しく導出する」
というDB設計の初歩が身に付いていないと思われる

以下、具体的にざっと見て気が付いた問題点を挙げてみる
(1) 料金テーブルの一意性(identity)が曖昧
 あるロウ(行)の一意性を保証するカラムはキーと呼ばれるけど、
 このテーブルには「ID」と「識別コード」という2つのキー候補がある
 現実世界のモデリングであれば、複数のキー候補が重複したり
 それを許容せざるをえないといった難しい局面も想定できるけど、
 今回の単純なDB設計演習課題であれば、1つに絞れるはず
(2) 料金テーブルの一意性(identity)が複雑
 このテーブルで一意性を保証するには、2つのカラム「料金ID」と「設定名」を
 組み合わせなければならない
 こうしたキー構成は複合キーと呼ばれ、現実世界のモデリングでは
 積極的に使う/使わざるをえないといった難しい局面も想定できるけど、
 今回の単純なDB設計演習課題であれば、1つキーだけで保証できるはず
(3) 複数の料金プラン間で共通するオプションが想定されていない
 たとえばウィルス検査サービス/自動メール転送サービスといった、
 各プランで共通するオプションが表現できていない

まず正規化という言葉を忘れ、「与えられた要求仕様をモデルで正確に表現する」という
視点でDB設計の考え方を見直してから、検討(勉強)を再開したほうがいいと思う
0102NAME IS NULL2015/02/27(金) 00:08:56.15ID:???
なんでその段階で複合キーやめろって話が出てくるんだ。そのキーはどっから現れるんだよ。
0103NAME IS NULL2015/02/27(金) 00:34:11.77ID:???
>>102
>なんでその段階で複合キーやめろって話が出てくるんだ。

複合キーを使ったDB設計法そのものは否定していないよ
それが必要になる/必要か否かを検討しなければならない局面はあるから

ただし、この程度の単純なお題で、なおかつ「ロウの一意性」というDB設計における
初歩の初歩を正しく理解していれば、単純に一つのカラムだけでキーを構成できるはず
今回のケースは腕自慢大会じゃないんだから、より単純な概念モデルのほうが
お題への解答として望ましいのは、しごく当たり前の話じゃないかな


>そのキーはどっから現れるんだよ。

もし >>102 が「ロウの一意性」を理解しているのなら、意味不明な質問だね
0104NAME IS NULL2015/02/27(金) 02:46:37.22ID:???
なにもおかしな状態のものを是正するアプローチをしなくても
最終的にほしいと思っている表をつくってもらうところから始めればいいかな。

日本人は表題好き民族といわれているから、最終的に欲している表はすぐかけると思う。
そっから手順に従って正規化を行えばよかろ。

まとめれば>>101の最後2行だけでいい
0105NAME IS NULL2015/02/27(金) 04:57:33.27ID:???
まずDB設計以前に要件定義なんだがな
どう見ても要求仕様なんて固まってない
0106NAME IS NULL2015/02/27(金) 08:13:34.85ID:???
>>103
料金IDと設定名と設定値があり、料金IDと設定名に対して設定値が一意に定まる(関数従属する)
という関係があるならば、(料金ID,設定名)が料金設定テーブルの候補キーとなるというのが
関係モデルで考えた場合の基本だが、別にそこに曖昧さも複雑さもないぞ。
一つのカラムだけでキーを構成できるというが、この「一つのカラム」って何を指してるのかね?
0107NAME IS NULL2015/02/27(金) 12:59:06.05ID:???
>>105
要件がはっきりしないからモデリングとか無理みたいな話はもういいから
0108NAME IS NULL2015/02/27(金) 14:57:58.17ID:???
「じゃが芋3個と人参2本を買いました、さて、お釣りは幾らでしょう」
とか出題されても誰も正答できんだろ?
出題の前にもっと問題をしっかり作れってなるよな?
0109NAME IS NULL2015/02/27(金) 15:05:40.32ID:???
>>108
静かにしてもらえませんか。
0110NAME IS NULL2015/02/27(金) 17:30:17.77ID:???
>>108
演算を求めてるわけじゃなく、設計の話だろ?
商品テーブルがあって、購入テーブルがあって、購入商品テーブルがあって〜
って、EC開発経験者なら大体想像できるわな。

その中で、「商品テーブルだけじゃ、”北海道産”の人参と”徳島県産”の人参が分からん」
とかツッコミ入れていき、それなら1つのテーブルに産地カラムを付けるべきだ、いや産地を別テーブルにするべきだ
とかなんとか指摘できるじゃん。

お前みたいな1から10まで正確な要件定義を求める奴って、想像性が足りないからだろ
0111NAME IS NULL2015/02/27(金) 17:58:59.71ID:???
DB設計とはどこまでを指してるのかって話にもなるんだが
要件定義を語るスレでも立てて要件定義はそっちで固めるとかしてほしいわ
完璧な要件定義だせとは言わんが、DB設計の話するならDB設計出来る程度の要件は提示してもらわんとな
0112NAME IS NULL2015/02/27(金) 21:16:11.85ID:???
読んでないが
何をもめているんだ?
設計できない言い訳か?
0113NAME IS NULL2015/02/27(金) 21:20:19.16ID:???
>>108
x = ジャガイモの価格
y = 人参の価格
3x+2y
できるじゃん
0114NAME IS NULL2015/02/27(金) 21:22:46.16ID:???
おっと失礼
お釣りを出すのなら、
答え = 客が出した金額 - ( 3x + 2y )
だね
0115NAME IS NULL2015/02/27(金) 21:23:25.87ID:???
俺が脱線したときの答え出したから、後は脱線したレス無しな
0116NAME IS NULL2015/02/27(金) 22:29:20.09ID:???
ブログ投稿のリビジョン管理はどう設計する?
投稿にはコメントがついてリビジョンには影響されない
リビジョンはgitのブランチみたいに好きな位置に戻れてそこから枝分かれする感じ

post
 post_id

post_revision
 revision_id
 post_id
 parent_revision_id 編集元のリビジョン
 is_active 現在有効なリビジョン

comment
 comment_id
 post_id

一応こんな感じのを考えたんだけど、もっと一般的な方法あるかな?
0117NAME IS NULL2015/02/27(金) 22:45:08.91ID:???
親post_idを持つだけじゃダメなんかな。
0118NAME IS NULL2015/02/28(土) 07:32:31.34ID:???
木構造じゃねぇの?
0119NAME IS NULL2015/02/28(土) 08:27:24.51ID:???
再帰クエリが使えるDBMSなら親IDを持たせるのが一番楽だな
配列型が使えるDBMSなら、経路列挙モデルでも良いと思う

他にも色々方法があるから"DB 階層構造"で検索すべし
01201162015/02/28(土) 12:56:16.79ID:???
post
 post_id
 parent_id
 root_id
 is_active
 post_data...

こうかな?
コメントやその他テーブルのFKと投稿ページのURLに使うpost_id等は変わらないから
初期投稿のpost_idから現在有効なリビジョンを取得するのにroot_idを追加してみた
どっちみち1回はjoinが必要だからこれがシンプルで無難かなー
0121NAME IS NULL2015/02/28(土) 15:12:08.20ID:???
>>116
>投稿にはコメントがついてリビジョンには影響されない

この仕様だとリビジョンを特定したコメントを付けられないけど、
それでいいのかな?
たとえば、ある改訂履歴を伴った記事に対して「今回の改訂内容は間違いじゃね?」と
コメントしたい時、この仕様だとリビジョンを明示的に指定する機能が無いから
コメントの本文中にコメント対象とするリビジョンIDを書かなければならない
この制限は、2ch掲示板だと(カキコ時に対象レス番号を指定する機能が無いから)
カキコ本文中にアンカとして対象レス番号を書くのと類似している

普通は、(投稿ではなく)リビジョンに対してコメントをつける仕様にすると思う
これをあえて逆にした利点や >>60 の意図/設計方針が分からない
0122NAME IS NULL2015/02/28(土) 16:51:54.33ID:???
バイナリ情報の格納テーブルをC(content)テーブルとして、
複数のモデル(A,B)からCを参照したいです。
(早い話、アップロードされた重いファイルを再利用したい)
参照するモデルは増えていく可能性あり。
・D(A_id,B_idを持つ)を定義し、CにD_idを持たせる。
・CにA_id,B_idを持たせる。
・AにC_id、BにC_idを持たせる(コンテントがモデルを保有するのは関係上おかしい気がする)
・A、Bそれぞれにバイナリ情報テーブルAC、BCを定義すべき。
どれがいいですか?
0123NAME IS NULL2015/02/28(土) 16:55:32.92ID:???
>>122
> ・AにC_id、BにC_idを持たせる(コンテントがモデルを保有するのは関係上おかしい気がする)
モデルがコンテントを保有しているように見えるけど、詳しく。
0124NAME IS NULL2015/02/28(土) 16:57:40.09ID:???
>>104
>なにもおかしな状態のものを是正するアプローチをしなくても

この意見はごもっともで、たしかに正規化という言葉へ過敏に反応してしまった感があります
でも、ただ単に「DB設計の基礎ができていない」と指摘するだけでは、
指摘された >>60 本人が(どこが良くないのか分からないから)途方にくれてしまうと考えました
だから辛口かもしれないけど、あえて具体的に問題点を指摘しています


>最終的にほしいと思っている表をつくってもらうところから始めればいいかな。

この発想は、このスレでたびたび議論になる「テーブルは分けるべき or 纏めるべき」の言葉で
言い換えれば:
 「(最終的に欲しいとおもっている要求仕様を)一つのテーブル(=表)へまとめてみよう」
という纏めるべき派に沿った提案であり、


>日本人は表題好き民族といわれているから、最終的に欲している表はすぐかけると思う。
>そっから手順に従って正規化を行えばよかろ。

纏める派の根拠が「日本人は表題好き民族といわれている」であるから、
「日本では纏めるのが普通」という発想になると思います(この推測、間違っていますか?)


>まとめれば>>101の最後2行だけでいい

>>101 の最後2行で示した方向性が重要なのはそのとおりですけど、
自分は分けるべき派だから、「(表に纏めてから)手順に従って正規化を行う」とは設計論が異なります
正規化は論理設計を一通り終えてから、最後の仕上げとして検証(正しく設計されているか確認)および
最適化(性能チューニング)を目的に行うものです
「正規化は検証/最適化の技法であって、要求分析や論理設計の技法ではない」と考えます
01251222015/02/28(土) 17:02:51.97ID:???
>123
DBの知識は乏しいのですが、具象でいうと、
記事(A)が画像(C)を保有する事と、画像(C)が記事(A)を保有する事では
前者が自然という意味です。
idについて言うと、A has Cの関係だと、CがAのidを持つ事が良いという事です。
01261222015/02/28(土) 17:30:40.22ID:???
すみません、上の2択は同一テーブルから複数のCは参照できないという制約がありますね。
01271222015/02/28(土) 17:43:37.04ID:???
あ、違う。
同一テーブルの異なるレコードから同一のCを参照することができない。でした。
日本語不自由ですみません。
何言ってんだこいつ、みたいな空気?
0128NAME IS NULL2015/02/28(土) 18:44:02.45ID:???
>>125
AがCを保有するほうが自然だといいながら、CがAのidを持つ事がよいという結論に至る理由が分からないので詳しく。
01291222015/02/28(土) 18:44:16.00ID:???
この件はClosedとさせて頂きます。
>・AにC_id、BにC_idを持たせる(コンテントがモデルを保有するのは関係上おかしい気がする)
AとCを1対多にしないのであれば、これが一番かもしれません。
ソースコード上ではマッピングでAがCを保有しているようにすればいいのかも。
AとCのオブジェクト指向的な親子関係はDB設計では問題がないのかな、
1対1においてもオブジェクト的に子要素となりうる方にidを定義しなければならないかなと思っていました。
そもそもモデルとコンテントが1対1という前提条件を記入していませんでした。以上です。
スレ汚しすみません。
0130NAME IS NULL2015/02/28(土) 18:45:38.11ID:???
>>124
まとめるべきといっているわけじゃない。
正規化を始めるにあたり、最終的に欲しているビューを開始点にすべきだといっている。
01311222015/02/28(土) 18:52:45.07ID:???
>128
1(A)対多(C)の関係を作るとして、CがAのidを保有しなければ
1つのAレコードは複数のCレコードを保有することができないと思ったからです。
0132NAME IS NULL2015/02/28(土) 18:53:37.02ID:???
>>131
そういうことなら連関エンティティを作るといいよ。
記事とコンテンツのマッピングをしているテーブルといったほうが通じやすいかな
01331222015/02/28(土) 19:33:08.78ID:???
>132
記事A
連関エンティティ・テーブルB(A_id、C_idを持つ)
コンテントC

新規テーブルDが増えた場合、
連関エンティティ・テーブルE(D_id、C_idを持つ)を追加

これなら、記事とコンテントの関係が1対多、多対多の場合でも対応できる。
という事ですか?
01341222015/02/28(土) 19:45:41.20ID:???
記事A(B_idを持つ)
連想エンティティ・テーブルB
コンテントC(B_idを持つ)
新規テーブルD(B_idを持つ)
でもいいのか。
01351222015/02/28(土) 19:57:33.09ID:???
>132
ありがとうございました。m(_ _)m
後は何とかします。
0136NAME IS NULL2015/02/28(土) 19:57:35.60ID:???
数値項目にNullは許すべき?
0137NAME IS NULL2015/03/01(日) 00:20:25.08ID:???
>>130
その「最終的に欲しているビュー」とは具体的にはどのような構造の情報ですか?
私はそれを「一つに纏めた表」だと推測しています(間違っていますか?)

そして正規化の始まりである「第一正規化された表」とは「一つに纏まった表」であり、
「正規化を始めるにあたり .... ビューを開始点にすべき」という主張は、
「まとめるべき」という主張を別の言葉で言い換えただけのものにすぎず、本質は同じです
0138NAME IS NULL2015/03/01(日) 00:43:26.81ID:???
>>137
もうコテつけるかまとめるスレ作ってそっちでやれよ
0139NAME IS NULL2015/03/01(日) 01:31:36.41ID:???
>>137
だからそっから正規化されてテーブルが分割されるんじゃん。
日本語不自由なのか?
0140NAME IS NULL2015/03/01(日) 07:24:12.14ID:???
>>137
日本語勉強しろ
0141NAME IS NULL2015/03/01(日) 07:55:00.37ID:???
>>137
関係データベースの理論を学んでいればわかること。
出発点はすべての属性の直積であって、これに選択、射影といった演算を行って
目的のデータを得るというのが本来の関係データベース。
ただしそのままでは更新異常等の問題があるので、関数従属性などをもとに
リレーションを分割するというのがリレーションの正規化。
で、ここまではあくまでも関係モデルの考え方。
上のレスを見ると関係モデルの言葉と実体関連モデルの考え方がごっちゃに
なっているように見える。独学者にありがちだけど。
0142NAME IS NULL2015/03/01(日) 08:51:14.09ID:???
>>111
モデリングスレならDB板できた直後からずっとあるよ
0143NAME IS NULL2015/03/01(日) 10:25:58.99ID:???
>>136
nullが不要なカラムなら非null制約つけとけ、必要なら使え
nullを-1とか999999とかで代用するのだけは止めれ
0144NAME IS NULL2015/03/01(日) 11:36:32.33ID:???
>>143
ばか
0145NAME IS NULL2015/03/02(月) 01:05:52.43ID:???
底辺
0146NAME IS NULL2015/03/02(月) 16:14:41.36ID:???
>>141
実体(entity)という言葉を知らずに、DB設計を語ってる(つもりの)奴が多そう。
0147NAME IS NULL2015/03/02(月) 16:57:30.61ID:???
>>121
> 普通は、(投稿ではなく)リビジョンに対してコメントをつける仕様にすると思う
そうかな?

普通は、今現在アクティブな投稿内容に対してコメントを付けるのでは?
で、post_idがPKなら、
post
 post_id
 contents(内容)
の内容が更新されていって、コメントは常にpost_idに対して行われる。
01481162015/03/02(月) 23:40:08.52ID:???
>>121
>>147
提案を参考に以下のようにしてみました。
これで1回実装してみようかな

post
 post_id

post_revision
 revision_id
 post_id
 parent_revision_id 編集元のリビジョン
 is_active 現在有効なリビジョン
 data...

comment
 comment_id
 post_id
 post_revision_id
0149NAME IS NULL2015/03/03(火) 10:31:16.38ID:???
>>148
post_revision.dataってブログの内容?
その構造だと、post一覧を持ってくるの厳しくない?
0150NAME IS NULL2015/03/03(火) 10:32:17.19ID:???
あ、is_active = trueのもの持ってくるのか・・・。
なんか、やだなぁ、それ。
0151NAME IS NULL2015/03/03(火) 13:17:26.10ID:???
そもそも、ブログで
> リビジョンはgitのブランチみたいに好きな位置に戻れてそこから枝分かれする感じ
ができちゃまずいんじゃないかと思ったりしたが。
1.1 -> 1.2 -> 1.3で1.3にコメントつけられたが、やっぱ1.2から分岐した1.2.1がcurrentねとかやられると、
1.3のコメントの立場は?って思う。
0152NAME IS NULL2015/03/03(火) 13:30:13.88ID:???
forkしたときはcurrentが増えるのではないだろうか。
ブログというよりwikiに近いものにも思える。
0153NAME IS NULL2015/03/03(火) 15:47:07.69ID:???
>>116は、本当にやりたいことが「gitみたいなリビジョン管理」なの?

本来の目的があって、その実現手段としてある実装方法を思いつき、「ある実現手段の実装方法は?」と
質問してしまうパターンじゃないの?

本当の目的が「gitみたいなリビジョン管理」じゃないのなら、真の目的の実現手段は別にあるかもよ。
0154NAME IS NULL2015/03/03(火) 17:28:58.33ID:???
本当にやりたいことがブログ投稿管理じゃなくて、バージョン管理そのものだったりして
0155NAME IS NULL2015/03/10(火) 02:37:01.16ID:???
本のように膨大な文字列があって、それを一頁だけとってくるようなテーブルってどう作ればよいですか?
ページの文字数はユーザーが変更できます
0156NAME IS NULL2015/03/10(火) 10:08:26.10ID:???
本は複数あるのか
その場合本はどのくらい想定しているのか
各本に対してページはどのくらい想定しているのか
ページの文字数はどのくらいを想定しているのか
ページをどうやって取ってくるのか(頁番号、文字列検索)
ページの文字数をユーザーが変更できるというのは具体的にどういうことか
ページの内容をユーザーが変更できるということか
0157NAME IS NULL2015/03/10(火) 10:27:41.09ID:???
プレーンテキストファイルに格納したら駄目なの?
0158NAME IS NULL2015/03/10(火) 11:27:01.22ID:???
>>156
スマホの読書アプリ使ったことないの?
0159NAME IS NULL2015/03/10(火) 11:31:27.81ID:???
ないな
0160NAME IS NULL2015/03/10(火) 11:55:07.67ID:???
じゃ使ってみなよ
0161NAME IS NULL2015/03/10(火) 14:17:40.39ID:???
本は複数です
本の数はわかりません
ページ数もわかりません
ページ番号は文字の大きさで変わるのですが、文字の大きさとユーザのページ番号は記録します。文字列検索はデータベースの昨日ではなく、別に対応します
ユーザーは本の内容を変更できません
ローカルファイルは使えませんが、AmazonS3のようなデータベースは使えます
0162NAME IS NULL2015/03/10(火) 16:11:22.59ID:???
文字の大きさだけでページが決まる粗末な設計ってことは宿題か何か?

>>156は無視していいんじゃないかなぁさすがに。
0163NAME IS NULL2015/03/10(火) 16:51:31.52ID:???
だけとは言ってないだろ
大きさで変わると言ってるだけだ
0164NAME IS NULL2015/03/10(火) 16:59:22.21ID:???
ふぅん。まぁいいけど、俺なら強制改行単位でレコード作るよ。
0165NAME IS NULL2015/03/10(火) 17:24:35.11ID:???
>>161
文字列検索エンジンから渡されるのが本IDと頁IDとして
本ID,頁ID,頁内容
頁内容の型はsqlserverだとvarcahr(max)
0166NAME IS NULL2015/03/10(火) 17:51:43.68ID:???
わかってない奴はひとりだけなのか、それとも複数人なのか。

>>165
> 本ID,頁ID,頁内容
だから、文字の大きさを変えたらページ番号が振り直されるんだってば。

>>155
> 本のように膨大な文字列があって、それを一頁だけとってくるようなテーブルってどう作ればよいですか?
> ページの文字数はユーザーが変更できます
これ、サーバアプリなの?
つか、サーバでやりたいの?
どうしてもサーバでやりたいなら、ページ数が変わる要因ごとに、サーバでプリレンダしてページ単位で保存するしかないのでは?
サーバへのリクエストでその処理をトリガーするのでもいいけど。

行間3パターンで文字の大きさが5種類あるなら、MAX15パターン。
英文フォントとかだと、文字の大きさを変えなくても、行間が調整されてページ内文字数が変わったりするかもだけど。
0167NAME IS NULL2015/03/10(火) 17:53:02.30ID:???
あー、あと画面サイズでもページ内文字数が変わったりするんかね。
サーバでやるの無理じゃね?
0168NAME IS NULL2015/03/10(火) 18:11:06.56ID:???
>>166-167
静かにしてもらえませんか
0169NAME IS NULL2015/03/10(火) 18:11:43.07ID:???
>>166
ありがとうございます
それが一番良さそうです
0170NAME IS NULL2015/03/10(火) 18:12:17.45ID:???
あ、>>165も入れないと不公平だね>>543
0171NAME IS NULL2015/03/10(火) 18:14:09.81ID:???
>>156が暴れてるのか
0172NAME IS NULL2015/03/10(火) 18:15:13.96ID:???
え、ほんとにサーバでやるの?
0173NAME IS NULL2015/03/10(火) 18:15:56.81ID:???
>>170
未来に生きてんな
0174NAME IS NULL2015/03/10(火) 18:23:18.63ID:???
各フォントサイズの時の一頁の文字数の最小公倍数をデータベースの一つのページとして保存して、レンダリングをクライアントでやろうと思います
0175NAME IS NULL2015/03/10(火) 18:59:00.76ID:???
あ、改行に対応できない
0176NAME IS NULL2015/03/10(火) 19:24:06.81ID:???
>>166
本ID,フォントID,頁ID,頁内容?
つか、文字列検索は別エンジンて事だが、それは何を返すのよ
0177NAME IS NULL2015/03/10(火) 19:34:52.28ID:???
もうこの話やめようぜ
0178NAME IS NULL2015/03/10(火) 20:02:33.29ID:???
ページの意識はDBに持たせない方が良いように思うんだけど
0179NAME IS NULL2015/03/10(火) 20:05:11.38ID:???
青空文庫を簡素化したものにすればいいじゃん。
なので>>164
0180NAME IS NULL2015/03/10(火) 20:20:17.63ID:???
データベースの設計の問題ではないようでした
すみません
0181NAME IS NULL2015/03/10(火) 21:28:09.34ID:???
mongoでいいじゃん
0182NAME IS NULL2015/03/24(火) 16:59:37.39ID:???
DELETE_FLAG という思考停止フラグ
http://getpocket.com/redirect?url=http%3A%2F%2Fqiita.com%2FJxck_%2Fitems%2F156d0a231c6968f2a474
0183NAME IS NULL2015/03/24(火) 17:00:05.16ID:???
あ、変なリンクになった
こっち
http://qiita.com/Jxck_/items/156d0a231c6968f2a474
0184NAME IS NULL2015/03/24(火) 18:02:49.51ID:???
途中まで読んだけど「あぁ、物理削除して怒られたんだな」って感想しか出てこなかった
0185NAME IS NULL2015/03/24(火) 19:15:18.00ID:???
コメントで変なのつけられたから、僕間違ってないよね?っていう確認のためにリンクを貼ったとしたら微笑ましい
0186NAME IS NULL2015/03/25(水) 00:45:43.05ID:???
>>185
正解かもしれんね。
0187NAME IS NULL2015/03/25(水) 10:25:15.39ID:???
『「DELETE_FLAG という思考停止フラグ」という思考停止』と読めた。
0188NAME IS NULL2015/03/25(水) 12:20:35.36ID:???
マスターを物理削除するという思考があり得ない
0189NAME IS NULL2015/03/25(水) 13:25:49.75ID:???
物理削除または状態管理が適している可能性があるからちゃんと考えようねってことでしょ
0190NAME IS NULL2015/03/25(水) 13:40:17.65ID:???
業務アプリなら、社員テーブルで物理削除するというのは、誤登録を除いてまずありえない
削除フラグ立てるより別テーブルに移動しろ?
JOINが超めんどくさいじゃん
0191NAME IS NULL2015/03/25(水) 18:10:11.75ID:???
やっぱりみんなこうなるのか、、、
今まで作ったDB、最初は何も考えずに
消すようにしてると、大抵のケースで問題になるから
削除はフラグになってたな
0192NAME IS NULL2015/03/25(水) 18:55:12.89ID:???
>>190
ビュー作っとけば?
めんどくさいことには変わりないけどさ。
0193NAME IS NULL2015/03/25(水) 19:28:07.65ID:???
>>192
マスタ系のテーブルは、トランザクション系のデータ一覧なんかを取得するときにJOINしまくると思うけど、
そのJOIN先を全部UNIONしたViewにしろと?
そんなことやったことないからわからんけど、パフォーマンス的にどうなのよ?
0194NAME IS NULL2015/03/25(水) 20:57:04.36ID:???
>>189
「それは削除じゃなくて状態です」とか「他に状態はありませんか?」が出てきた辺りで混乱したな
論理削除自体が状態管理だろと
削除されているかどうかの答えだってtrue/false/unknown以外が入ってたら地雷設計やろ
0195NAME IS NULL2015/03/25(水) 22:41:39.75ID:???
ここは安定して低脳の集まり
0196NAME IS NULL2015/03/25(水) 23:19:34.02ID:insjhg41
要件的には1つのテーブルで足りるのですが、
後の拡張を予測して、正規化しようか悩んでいます。

作っているプロジェクト自体が小規模を対象としており、
拡張する可能性が無いと思うのですが、
先々の事まで考えて設計するべきか悩み、停滞しております。。。

こういうとき、みなさんならどう設計しますか?
要件通り、1つのテーブルでまとめますか?
それとも万が一の事を考えてテーブルを分けますか?
0197NAME IS NULL2015/03/26(木) 01:53:44.16ID:???
要件と正規化が同一で扱われてるのがおかしい
要件をみたすのは当たり前で、それを正規化しない理由がわからん

正規化のためにテーブル分ける必要があるなら分ける
将来的に変更(拡張)しないことなんて、正規化しないことの理由にならん
0198NAME IS NULL2015/03/26(木) 03:17:23.44ID:???
なんか他人の俺が記事を擁護してもしょうがない気がしてきた。

>>195
まったくで。

>>196
現状の要件では、1つのテーブルで十分正規化されてるってことでいいよね。
そうなら1つのテーブルのままでいいよ。
0199NAME IS NULL2015/03/26(木) 06:54:03.76ID:???
>>198
> 1つのテーブルで十分正規化されてるってことでいいよね。

どうやったらこんな解釈ができるんだ?
安定した低能君恐るべしw
02001962015/03/26(木) 12:10:09.03ID:???
>>197
正規化すると開発の手間や難易度が増えるので(あくまでも自分たちの中では)
1テーブルで収まるなら正規化せずに行こうと考えがちです。

>>198
十分はされていないと思います。

例えば商品テーブルがあって、商品をカテゴリ毎に分けるという仕様があるとします。
商品テーブルにカテゴリIDを追加するだけでいいやってのが今の設計段階なのですが、
「もしかしたら、複数カテゴリに所属する可能性はないか?」って考えが浮かび、
そうなると別テーブル(中間テーブル)を作って正規化した方が良いとなります。

ですが、要件的には「1つの商品にカテゴリは1つ」であり、現実的に考えても
複数カテゴリを指定できるなんて、かなり規模のでかいECサイトぐらいです。
Amazonや楽天レベルならまだしも、自分が関わるプロジェクトや顧客に
それほどまでのサイトになる案件はありません。

ですので、「開発しやすい1テーブルにまとめればいいんじゃね?」
って考えが浮かび、正規化しないパターンも考えているのです。

でも、昨日こちらに書き込んでから「正規化しても大した手間ではない」
と思い、分ける方向で行こうとしていますが・・。
0201NAME IS NULL2015/03/26(木) 13:18:57.85ID:???
論理削除が一部でバズってるな。
削除フラグが嫌いな人が多いようで。
俺は好きだが。
0202NAME IS NULL2015/03/26(木) 13:40:37.24ID:???
>>200
> ですが、要件的には「1つの商品にカテゴリは1つ」であり、
だとすれば、複数テーブルに分割するのは正規化じゃないね。
顧客テーブルに性別があり、その性別を別のテーブルに分割することは可能だけど、それは正規化じゃない。
0203NAME IS NULL2015/03/26(木) 14:31:45.45ID:???
一度正規化してから、運用でそれを採用するかを考えるべきで
やりもしないで採用するかしないかを考えるのは
正規化のやり方わかりませんと言いたくないだけかと
0204NAME IS NULL2015/03/26(木) 15:14:40.01ID:???
削除フラグ云々のブログ見てると、CRUDのUとDなんかいらん、immutableであるべき派が結構いて驚く。
immutableであるべき派だからこそ、削除フラグやNULLが許せなくてブログ書くから目立つのかもしれないが。
0205NAME IS NULL2015/03/26(木) 15:38:03.79ID:???
>>200
現時点の要件に対して十分に正規化されているかどうかだよ。

「もしこうなった場合に対応できないからこれは十分とはいえない」という考えを捨てるべき。
02061962015/03/26(木) 18:52:07.00ID:???
>>205
そう思えるかどうかですね。どうしても良い設計を探求したくなるので・・・。

とりあえず>>203さんの言うように、一度正規化してから
「それでもやっぱり複数登録する必要はないか?」を考えて
最終的にどうするか考えます。みなさんアドバイスありがとうございました。
0207NAME IS NULL2015/03/26(木) 19:01:56.56ID:???
複数登録する必要があるかないかは、ステークホルダーが決めることで、君が悩むことではないのでは?
0208NAME IS NULL2015/03/26(木) 21:09:25.29ID:???
ステークホルダーが複数登録してくれって言いそうだから、予めそれを想定したテーブル設計にするとかはあるけどな
0209NAME IS NULL2015/03/26(木) 23:11:56.48ID:???
モデリングの話だよな。「正規化」を何だと思っているんだろう。
0210NAME IS NULL2015/03/27(金) 03:19:23.75ID:???
現在の要件では正規化されています
現在のテーブルレイアウトでは正規化が保てなくなる仕様変更が
あるかもしれませんがないかもしれません。どうしましょう?

こういう事だろ
好きにしろとしか言えんわ
0211NAME IS NULL2015/03/27(金) 04:20:46.16ID:???
>>210
俺もそう思うんだけど、>>199によると違うらしい。
>>199がそれ以降レスをしているかどうかは不明。
0212NAME IS NULL2015/03/27(金) 06:56:20.34ID:???
しかし本人が、とりあえず正規化してみるとか言ってるわけだしなぁ。
正規化がなんなのかわかってない可能性が大だけど。
0213NAME IS NULL2015/03/27(金) 08:26:32.30ID:???
>>211
日本語の勉強からやり直せよ

>>196
> 後の拡張を予測して、正規化しようか悩んでいます。

>>198
> 現状の要件では、1つのテーブルで十分正規化されてるってことでいいよね。
>>200
> >>198
> 十分はされていないと思います。
0214NAME IS NULL2015/03/27(金) 09:30:12.46ID:???
>>200は
「現在の要件では正規化できているけど、要件が追加された場合を考えるべきでしょうか」
としか読めない気がするがね

「本人が十分ではないと思うとレスしたから正規化が不十分なんだ!」
と思ったのなら、煽りでなく真面目にアスペルガー症候群の疑いがある
現実でも人と揉めて苦しい思いをしているなら、一度心療内科に行った方がいい
0215NAME IS NULL2015/03/27(金) 13:09:44.48ID:???
仕様の変化を見越して柔軟な設計にしておく、というと聞こえが良いんだが、実際は柔軟な設計に
対する実装はコストがかかるケースが多いし、その柔軟な設計に対する実装にバグがあったら、
その修正コストは誰が払うべきなんだという問題もある。

今回のケースでは、一つの商品に対して複数の商品カテゴリを登録できるようにしておく、というのが
仕様の変化を見越したモデリングだが、そうすると、JOIN結果が「常に1レコード」から「複数レコードも
ありうる」ということになり、それに対応したコードを書かなければならない。

一つの商品に対して複数のカテゴリを登録できるようにするという仕様に将来なったとき、結局
UI部分もビジネスロジック部分も変更しなければならないのだから、今そうしておく必要性は薄いと思う。
0216NAME IS NULL2015/03/27(金) 13:57:32.04ID:???
>>215
これが一番納得行く回答だね
0217NAME IS NULL2015/03/27(金) 16:59:23.42ID:???
>>214
本人がそう言ってるのはその通りだけど
その本人のレベルを推し量ると、ほんとにちゃんと正規化出来てるとは思えないフシはあるがな

だからって
>1つのテーブルで十分正規化されてるってことでいいよね。
という前提で回答したものに

>どうやったらこんな解釈ができるんだ?
というのも安定した低能君の反応だわなw
0218NAME IS NULL2015/03/27(金) 23:40:13.30ID:???
>>217
テンパってないか?
0219NAME IS NULL2015/03/28(土) 08:30:17.45ID:???
そんなに物理削除したいのかお・・・
0220NAME IS NULL2015/03/28(土) 08:33:02.47ID:???
>>214
本人が正規化できてないと思ってるって言ってるけど「なんの根拠もないけどぼくは正規化されてると感じるんだ」ってか?w
病院行ってもダメなレベルだから、そのまま引き籠っとけよ
0221NAME IS NULL2015/03/28(土) 08:45:49.62ID:???
>>215
設計側の視点だけで見てると、実装側の労力を見落とすことって多いよな

仕様変更を余儀なくされる可能性が高い訳でもないのに、勝手に先回りして
余計な事をしない方が良いと俺も思うわ
0222NAME IS NULL2015/03/28(土) 10:49:35.55ID:???
「何も足さない、何も引かない」 ってCMあったけど
こえr名言だと思う
0223NAME IS NULL2015/03/28(土) 14:18:27.04ID:???
>>220
落ち着いてもう一回最初からレスを読み直してみたらどう。
0224NAME IS NULL2015/03/28(土) 15:39:41.38ID:???
>>223
それは君の方だろ...

>>196
> 後の拡張を予測して、正規化しようか悩んでいます。

現状正規化されてるなら、悩んだりしてないと思うぞ
0225NAME IS NULL2015/03/28(土) 17:06:21.66ID:???
今のテーブルの正規化と将来の拡張は関係ないんだから元のその文がそもそもおかしいな。
既に書かれているように正規化をなにか勘違いしているんだろう。
0226NAME IS NULL2015/03/28(土) 17:40:48.89ID:???
今のテーブルを正規化して将来につなげるっておかしな考えなの?
0227NAME IS NULL2015/03/28(土) 17:47:25.16ID:???
>>226
その言い方だと、いま正規化されてなくても問題はないみたいだ
将来の仕様変更があろうが無かろうが、正規化はしておくのが普通だろう
0228NAME IS NULL2015/03/28(土) 17:59:04.88ID:???
>>227
> その言い方だと、いま正規化されてなくても問題はないみたいだ

ひとつのテーブルで足りるとか書いてるから、少なくとも >>196 は問題ないと考えてるんだろ
0229NAME IS NULL2015/03/28(土) 18:36:53.09ID:???
>>224
そこを引用した上で理解できないって末期だよ
0230NAME IS NULL2015/03/28(土) 18:43:25.75ID:???
現時点で満足してたら質問してこないだろ。
満足してないから質問してくるわけで。
0231NAME IS NULL2015/03/28(土) 18:46:38.21ID:???
>>225がわかりやすく書いてくれてるのになんで続くんだよw
適性無い新人さんでも紛れ込んでんのか?
0232NAME IS NULL2015/03/28(土) 18:54:55.90ID:???
>>229
はいはい、ぼくちゃんなら(こんきょはないけど)こうかんがえるんだ
ってか?w
0233NAME IS NULL2015/03/28(土) 19:03:09.45ID:???
>>231
>>225 は単なる憶測だし、意味のないレスにしか見えんが
0234NAME IS NULL2015/03/28(土) 19:55:37.18ID:???
>>196の解釈をめぐって議論しても意味がないということだろう。
0235NAME IS NULL2015/03/30(月) 18:02:13.31ID:???
>>226
> 今のテーブルを正規化して将来につなげるっておかしな考えなの?
主キーと1:1な関係の属性が、将来1:nになるかもしれないのを見越した設計を正規化とは言わないよ。
0236NAME IS NULL2015/03/31(火) 11:18:45.16ID:???
いや、言うだろ。1:nでも当面は1:1にしておけばいいわけだ。
具体的に言えば、会員テーブルをログイン情報とプロフィールに分けるのと同じだよ。
0237NAME IS NULL2015/03/31(火) 11:45:13.64ID:???
会員テーブルをログイン情報とプロフィールに分けるのは、正規化とはいわないだろ。
0238NAME IS NULL2015/03/31(火) 13:14:16.10ID:???
>>236
「現状の要求仕様で、主キーと1:1な関係の属性を、将来1:nになるかもしれないのを見越して
別テーブルに分割する」ということを正規化とは言わないという趣旨。

つまり、元発言者は、正規化するかしないかの決断をしているわけではなくて、要求仕様の
弾力化をするかしないかの判断をしているということ。
ちなみに、俺はしない方が良いと思う。

1:nにも対応することに決めたときに、主キーと1:nな関係の属性のテーブルを分割することは
正規化だけれども。
0239NAME IS NULL2015/03/31(火) 15:09:33.18ID:???
1:nでも1:1として利用してもいいわけだ。仕様は「1つしか登録しない」のだから。
じゃ、正規化してテーブル分けて1:1にしておき、後から複数登録が必要になった時、
それが出来るようにすればいいだけ。テーブル構成を変える必要もないし、
拡張コストもあまりかからない(ビュー側の変更だけ
0240NAME IS NULL2015/03/31(火) 16:24:22.42ID:???
>>239
> じゃ、正規化してテーブル分けて1:1にしておき、後から複数登録が必要になった時、
> それが出来るようにすればいいだけ。
だけじゃないから、余計なことはしない方が良いと言ってます。

items: {item_id, description, category_name}
あるいは、
items: {item_id, descritpion, category_id}
categories: (category_id, description}
とするのを
items: {item_id, description}
categories: {category_id, description}
item_category: {item_id, category_id}
と分割したとき、
あるitemのcategoryの内容を変更したり、itemを削除するときに、余計なコードが必要です。
また1:1であることを保証するのを、アプリケーション側、あるいはデータベース側の制約で実装する必要があります。
「1:1であることを保証する」コードは、1:nになったときには削除する必要があります。

さらに、コードで保証する場合、バグやマニュアルでitem_categoryデータを登録するとデータ全体に不整合が
起こり、1:1が前提のコードの部分で、最悪アプリが落ちる原因になるかもしれません。
0241NAME IS NULL2015/03/31(火) 18:36:32.27ID:???
テーブル設計において「かもしれない運転」をするのは結果的に悪だということを理解できないのは
素人もしくはエンタープライズかぶれのどちらかじゃないだろうかと思うことがある。

「かもしれない」と「これはありえない」の境界線をどこで引くのか見てみたいものだけれど。
0242NAME IS NULL2015/03/31(火) 19:25:28.17ID:???
質問者の意図を○○かもしれないどころか□□だろうと妄想してウダウダ言ってるだけのアホしかいない w
0243NAME IS NULL2015/03/31(火) 21:26:28.46ID:???
質問者の意図は回答してる人はみんな理解してるだろ
ただ、その用語が正しくないって言うだけで

個人的には「1つしか登録しない」という顧客の発言を
「1つしか登録できない」と読み替えるかどうかは微妙なラインだと思うが
0244NAME IS NULL2015/03/31(火) 23:40:53.52ID:???
そのみんな理解している内容が脳内変換だエスパーだと騒ぐ人がいたんだけど
いなくなってしまったのがちょっぴりさみしい
0245NAME IS NULL2015/03/31(火) 23:56:16.26ID:???
本当に設計って難しいものですね
0246NAME IS NULL2015/04/01(水) 00:03:12.26ID:???
「脳内」「エスパー」で検索してもレスが見つからないんだが、それはもしかしてあなたの
0247NAME IS NULL2015/04/01(水) 02:38:39.80ID:???
>>240
A)メインテーブルに関連項目(カテゴリIDとか)を入れる
B)関連項目は別のテーブルに分ける

として、スタート時の要件は1対1とする。
この場合、Bで設計していたら1対多にするのは簡単だけど、Aにしてたら無理じゃないか?
メインテーブルのカラムを変えないといけないし、既に稼働してたら停止しなくちゃいけないぞ。

でも、BならUIやプログラム(SQL含む)の変更だけで済むから、テーブル設計を変えなくてもいい。
1対多であっても1つしか登録しないケースも有るわけで、
バグやデータ全体の不都合なんて起こらないと思うんだが。
0248NAME IS NULL2015/04/01(水) 04:15:43.63ID:???
>>247
>>240の構成を元にして話を進めるけど、
descriptionを複数持たせたいって要件が発生した時のことは気にしなくていいの?
0249NAME IS NULL2015/04/01(水) 09:31:27.57ID:???
>>248
それなら尚更分けるべきじゃね?
0250NAME IS NULL2015/04/01(水) 09:36:44.48ID:???
ああ、あと>>240の構成がそもそもおかしいな。

items: {item_id}
categories: {category_id, description}
item_category: {item_id, category_id,description}

itemのcategory毎にdescriptionを持たせたいならこうするべきだろ。
description以外のカラムを追加したい時もitem_categoryに追加すればいいし、
メインのitems・categoriesをいじる必要もない。
0251NAME IS NULL2015/04/01(水) 10:49:49.21ID:???
>>248
> >>240の構成を元にして話を進めるけど、
> descriptionを複数持たせたいって要件が発生した時のことは気にしなくていいの?
いやだから、そういう要件が発生したときに変更を行えって話で。
ノーコスト(に近いコスト)で、柔軟な設計にできるのならば、それでいいが。
あるいは、要件が変更になったときに、ノーコスト(に近いコスト)で対応できるなら、それをする価値があるかもしれない。

今回の話は、1:1が1:nになったとき、結局あちこち変更する必要があるんだから、そうなったときにデータモデルも
変えればいいでしょってこと。

>>250
items.descriptionは、item自身のdescription。
要するに、PK以外になにかの属性があるってことを示しているだけ。
0252NAME IS NULL2015/04/01(水) 10:54:35.66ID:???
まぁ、データベースのスキーマ変更に多大なコストが必要な場合(*1)は、
最初から1:nにも対応できるモデルにしておくのもありかもしれない。

(*1) 多段階のレビューや承認が必要な場合や、データベースのマイグレーション
コストが高くて、簡単には変更できない場合など。
0253NAME IS NULL2015/04/01(水) 11:10:15.96ID:???
>>251
>items.descriptionは、item自身のdescription。
>要するに、PK以外になにかの属性があるってことを示しているだけ。

でもさ、実際に「登録したカテゴリに説明を加えたい」という要件が出るかもしれない。
その場合も中間テーブルがある事で柔軟な拡張が可能になるよ。
0254NAME IS NULL2015/04/01(水) 13:09:28.74ID:???
多数派の意見にある通り、「要件が増えた時に対応」で良いと思うよ。

>>253
って事についても、要件が「複数カテゴリを登録させたい」になった時に
中間テーブルを作成すればいいだけだよ。
そしてitemsのカラムも削除しなくていい。そのまま使えば。
items内のitem_id、category_idをitem_categoryにコピーするのは簡単だし。

itemsのcategory_idは表示用のカテゴリにして
item_categoryのcategory_idは検索用とか複数選択用のカテゴリにすればいい。

正規化の概念からしたらitemsにcategory_idが残るのは気持ち悪く感じるかもしれないけど、
上記のように「表示用・検索用」と分けて考えるなら、有りだと思う。
02552482015/04/01(水) 13:19:03.21ID:???
>>251
その言葉は>>247に言ってやってくれ
0256NAME IS NULL2015/04/01(水) 13:33:57.61ID:???
>>255
ごめん、なんか勘違いしてた。
0257NAME IS NULL2015/04/01(水) 19:22:34.91ID:???
>>244
脳内変換君チース w
0258NAME IS NULL2015/04/24(金) 16:14:48.74ID:???
たとえば「お酒」のデータベースを作成するとき、「お酒」の種類によってテーブルを分けるべき? 分けなくてもいい?

具体的には、日本酒なら「原料米」、「精米歩合」などの情報が必要で、
ワインならその情報は必要なく、代わりに「原料葡萄」、「パーカーポイント」などが必要。

それを、ひとつのテーブルにごちゃごちゃ入れるなら分ける必要ないけど、
日本酒、ワインに共通する「名称」や「メーカー」などは共通の1テーブルとし、「日本酒」、「ワイン」をそれぞれ別テーブルとした方がすっきりするかなぁ?
0259NAME IS NULL2015/04/24(金) 20:46:26.40ID:???
>>258
普通にお酒テーブル、日本酒属性テーブル、ワイン属性テーブル、... でいいかと
0260NAME IS NULL2015/04/24(金) 21:11:55.72ID:???
>>258
世界中で販売されてるアルコール類の総数なんて知れてるんだからアルコール類テーブルで良いかと
それにメーカーテーブル、製法テーブル、原料テーブル
どう分けるかは、結局のところ表示(データをどう扱うか)に依存すると思う
0261NAME IS NULL2015/04/24(金) 21:15:09.31ID:???
表示だけならtextで持っちゃえばいいし
絞るならJSONとかでもいい
分ける必要は感じないかなぁ
0262NAME IS NULL2015/04/25(土) 00:04:17.87ID:???
スーパータイプ/サブタイプの表現方法は主に3種類あるが、絶対的な優劣というものはない。
それぞれメリット/デメリットあるので要件に応じて判断する。
0263NAME IS NULL2015/04/28(火) 16:10:12.02ID:???
258です。
みなさま、ありがとう!
0264NAME IS NULL2015/05/09(土) 17:48:10.03ID:gMN7AwQo
問屋、販売店、消費者を記録するテーブルが必要で、
それぞれ商品テーブルを扱う場合、どういう設計が適切ですか?

問屋が登録した商品を販売店に納品し、
販売店から消費者が商品を購入するイメージです。

悩んでいる部分を書くと、

1:問屋、販売店、消費者テーブルは3つに分けるのか1つのユーザテーブルにするか?
2:問屋と販売店は会社情報テーブルと結合させたい。
  消費者は商品のレビューを投稿したいので、プロフィールテーブルと結合したい。
 (それぞれ関係は1:1)
3:商品テーブルに問屋ID、販売店IDなどのカラムが必要か?

この3点が気になり、どんなテーブル設計にするか悩んでいます。
良いアイディアがあれば助言おねがいします。
0265NAME IS NULL2015/05/09(土) 19:07:06.77ID:???
>>264
何のためのDBなんだ?

>問屋、販売店、消費者テーブルは3つに分けるのか1つのユーザテーブルにするか?
その三つが、同一として扱わなければならない理由があるなら一つのテーブルもありかもしれん

>問屋と販売店は会社情報テーブルと結合させたい
すればいいんじゃね。何が疑問かわからん
問屋とか販売店とかの定義が固まってないのに会社情報テーブルとか
プロフィールテーブルとか出来上がってるのが謎だが

>商品テーブルに問屋ID、販売店IDなどのカラムが必要か?
商品が特定されたときに、自動的に問屋や販売店が特定されるなら必要かもしれんな
それ以外に必要な理由が浮かばん
なぜそのカラムが必要だと思ったんだ?何の情報を格納する気だ?
0266NAME IS NULL2015/05/09(土) 20:17:47.90ID:gMN7AwQo
>>265
>何のためのDBなんだ?
商品を販売管理するためのDBです。
分かりやすいように一般的な名称にしましたが、
具体的には以下のような意味合いです。

問屋=メーカー
販売店=メーカーが作った物を販売するお店、人
消費者=それを購入する人
商品=メーカーが作った商品

>>問屋、販売店、消費者テーブルは3つに分けるのか1つのユーザテーブルにするか?
>その三つが、同一として扱わなければならない理由があるなら一つのテーブルもありかもしれん

問屋、販売店、消費者ともに自分達の専用ページ(管理画面)があります。
その管理画面にて商品を登録したり、消費者なら購入履歴を閲覧できるイメージです。
つまり、ログインやら会員に関する部分は共通テーブルにした方が良いのかな?
と言った悩みです。

>>問屋と販売店は会社情報テーブルと結合させたい
>すればいいんじゃね。何が疑問かわからん

1のユーザーテーブルを3つにするか1つにするかで結合方法や設計が変わります。
だからどうすればいいか悩んでおります。
会社情報やらプロフィールやらのテーブルが必要だというのは決まっています。

>>>商品テーブルに問屋ID、販売店IDなどのカラムが必要か?
>なぜそのカラムが必要だと思ったんだ?何の情報を格納する気だ?

メーカーや販売店は自分の商品がいくつ売れたのか?を知りたいです。
商品の販売状況が分かれば、仕入れを変更できます。
そして商品に販売店IDがあれば、「どこの店のどの商品が売れてるのか?」
というのを消費者にアピールする事が出来ます。
0267NAME IS NULL2015/05/09(土) 22:11:43.81ID:???
>>264
【小規模】
問屋+販売店+消費者テーブル:ユーザID
商品テーブル:商品ID、ユーザID
流通テーブル:商品ID、販売元ID(ユーザID)、販売先ID(ユーザID)、注文日、料金、出荷日、到着日、等々
履歴テーブル:商品ID、販売元ID(ユーザID)、販売先ID(ユーザID)、注文日、料金、出荷日、到着日、等々


【中大規模】
問屋テーブル:問屋ID
販売店テーブル:販売店ID
消費者テーブル:消費者ID
商品テーブル:商品ID、問屋ID
流通_仕入れテーブル:商品ID、販売店ID、注文日、料金、出荷日、到着日、等々
流通_販売テーブル:商品ID、販売店ID、消費者ID、注文日、料金、出荷日、到着日、等々
仕入れ履歴テーブル:商品ID、販売店ID、注文日、料金、出荷日、到着日、等々
販売履歴テーブル:商品ID、販売店ID、問屋ID、注文日、料金、出荷日、到着日、等々


予算・規模・画面・速度を加味して上から選ぶ感じで
何かの手違いで消費者情報が洩れるとまずいので、できれば分ける方が良い
0268NAME IS NULL2015/05/09(土) 22:55:03.47ID:???
>>266
>ログインやら会員に関する部分は共通テーブルにした方が良いのかな?
会員って何かしらんが、それが販売店と消費者を同一に扱う理由になるのか?
ログインを共通にしたければすれば良いけど、それと販売店と消費者が同一かどうかとは別の話

>会社情報やらプロフィールやらのテーブルが必要
情報が必要なのが決まってるってならわかるが
>1のユーザーテーブルを3つにするか1つにするかで結合方法や設計が変わります
のに、テーブルが決まってるのはおかしくないの?
まあ、決まってるなら別に悩む必要もないだろ。分けたら分けた各テーブルに
わけなかったらその一つのテーブルに結合すれば良いだけだし

>メーカーや販売店は自分の商品がいくつ売れたのか?
自分の商品って何だ?
商品によってメーカーが決まるなら、商品にメーカー情報を持つのはありだけど
商品を売った所がどこかと言うのは、商品を売ったと言う情報に持たせる必要があるんだが
商品に販売店IDがあるということは、商品が決まれば販売店が決まると言う事だぞ
つまり一つの商品はかならず一つの販売店でしか取り扱わないと言う事だぞ
0269NAME IS NULL2015/05/09(土) 23:37:17.85ID:gMN7AwQo
>>267
詳しく想定していただきありがとうございます。
小規模だと1つのユーザテーブルにして、
中大規模だと分けるというのは考えていませんでした。

次のレスにも記載しますが、
ユーザテーブルを分けると、関連するテーブルもその数分、必要になる気がして
一緒にした方が良いのかな?と悩んだりしております。
0270NAME IS NULL2015/05/09(土) 23:41:43.79ID:gMN7AwQo
>>268
>会員って何かしらんが、それが販売店と消費者を同一に扱う理由になるのか?

誰でも問屋や販売店になれるシステムではなく、
商品購入などの履歴を見たりしたいので、会員機能が必要です。
それを勝手に分かってもらえると思い込んでいました。すみません。

ログインID(またはメールアドレス)、パスワードにて専用画面にログインし、
問屋は問屋用のメニューを、販売店は販売店用のメニューを、
消費者は消費者用のメニューを利用します。

ということは、「メールアドレス認証テーブル」「パスワード再発行テーブル」
などの会員制サービスによくあるテーブルが、ログイン対象分必要になってしまいます。
3つのユーザ×関連テーブルとなるため、テーブル数が増えすぎます。

もちろん、「テーブル数が増えることなんて気にしなくていい」
という事ならそうなのでしょうが、それで良いのかと思い、質問した次第です。

>自分の商品って何だ?
>>264に書きましたが、問屋は自分が商品データを登録するわけです。
販売店は問屋から商品を仕入れます。
自分(問屋や販売店)が扱う商品がどの程度売れるのか見たい、という意味です。

>商品に販売店IDがあるということは、商品が決まれば販売店が決まると言う事だぞ
それは問題無いです。例えばシャープのテレビがあったとして、
それをヨドバシカメラに納品し、山田太郎さんが買ったとします。

その段階で、問屋(メーカー)であるシャープはどこの販売店が
テレビの売上がいいか調べる事が出来ます。
販売店もどこの問屋のテレビが売れるか調べる事が出来ます。
それが分かれば、今度からはその問屋から多く仕入れよう、となるわけです。

>つまり一つの商品はかならず一つの販売店でしか取り扱わないと言う事だぞ
問屋が別の販売店に同じ商品を納品する時は、
商品データを複製追加するのはおかしいですかね?おかしいですね。。

上記で記載したように、「商品がどの販売店で売れて、それはどこから納品されたのか?」
を知る設計が必要なのですが、具体的に分かりません。
02712642015/05/10(日) 00:11:50.57ID:???
三連投すみません。>>267さんの設計を見ると、大きく誤解していたかもしれません。
もしかして以下のような設計が良いんですかね?
これなら過度にテーブルは増えないし、
他のテーブルを作って結合する必要がない気もします。

問屋テーブル:ID、メールアドレス、パスワード、会社名、担当者名、住所・・・etc
販売店テーブル:ID、メールアドレス、パスワード、会社名、担当者名、住所・・・etc
消費者テーブル:ID、メールアドレス、パスワード、ニックネーム、名前、住所・・・etc

パスワード再発行テーブル:問屋ID、販売店ID、消費者ID、識別コード、日付
メールアドレスの認証テーブル:問屋ID、販売店ID、消費者ID、識別コード、日付

消費者(ID:1)がパスワード再発行の申請をした時に追加されるレコード
NULL|NULL|1|Adu1e5sQ|2015-05-10
0272NAME IS NULL2015/05/10(日) 05:38:13.34ID:???
>>271
小規模低予算なら作り手がサクッと作る
大規模なら高額プロにお任せ

ここに書き込んでいる時点で経験が浅いよね。
だから上に書いたのをヒントに自分がやり易いようにやるのが最適解だよ。
データ不備が見つかったら修正で良いじゃない
0273NAME IS NULL2015/05/11(月) 00:12:04.01ID:???
ログインが必要なら認証に関するテーブルを別に作ればいいだけじゃね。

■認証関係
ログインテーブル(メールアドレスとかパスワードとか有効フラグとか)
パスワード再発行テーブル
メールアドレスの確認テーブル

■利用者
問屋テーブル:問屋ID、ログインID
販売店テーブル:販売店ID、ログインID
消費者テーブル:消費者ID、ログインID

みたいな感じでデータを保持すれば何も問題ないでしょ。
仮に代理店とか修理屋とか利用者が増えても過度にテーブルが増えない
0274NAME IS NULL2015/05/11(月) 00:15:38.75ID:???
パスワード再発行テーブル
メールアドレスの確認テーブル

これ用意する意味わからん
0275NAME IS NULL2015/05/11(月) 00:23:26.13ID:???
どの販売店がどの商品を売ったのかという情報は、販売店とも商品とも切り離せるよね。

販売情報:販売店ID、商品ID、販売先ユーザID、販売日
とか
購入情報:ユーザID、購入日、販売店ID、商品ID

のようなテーブルを作ればいいよ。

> それはどこから納品されたのか?
これについては、問屋(メーカー)という表記がとても気持ち悪いので、真意が読めないけれど
メーカーであるとするならば、商品情報にメーカーは含まれるはずだから問題ない。

本来の意味である問屋だとするならば、ある商品について
仕入れ情報:どの問屋から何個仕入れたか
という情報は必要だろうけれど、どの問屋から仕入れたものを誰に売ったかというのは意識しないでしょ。

トレーサビリティを持たせるなら話は変わるけれど、それなら商品各個にシリアルを持たせなければならない。
0276NAME IS NULL2015/05/13(水) 11:54:15.05ID:???
設計って難しいね。
正規化にこだわって1対1なのに2つのテーブルに分けたら、
参照する時は(ほぼ)必ず2つのテーブルにアクセスする事になったから、
やっぱり1つのテーブルにまとめた方が良い、とかよくある。
0277NAME IS NULL2015/05/13(水) 11:58:03.94ID:???
設計ってそうじゃないんだけどな
0278NAME IS NULL2015/05/13(水) 12:29:03.69ID:???
>>276
> 正規化にこだわって1対1なのに2つのテーブルに分けたら

意味がわからん
0279NAME IS NULL2015/05/13(水) 14:38:29.42ID:???
また、まとめるまとめないの話をしたがる奴が来た
0280NAME IS NULL2015/05/13(水) 15:09:17.66ID:???
相変わらず同じ流れになるよね
0281NAME IS NULL2015/05/13(水) 15:44:59.49ID:???
>>276
> よくある。
ざっくりでいいので、母数と割合がどれくらいか教えてもらえる?
あと、よくあるにも関わらず何度も同じ轍を踏むのはなんで?
0282NAME IS NULL2015/05/13(水) 16:33:09.77ID:???
「理論から学ぶデータベース実践入門」読め
0283NAME IS NULL2015/05/13(水) 16:51:46.65ID:???
>>281
横だけど、そんなもん個人の範疇以外で答えられんだろw
0284NAME IS NULL2015/05/13(水) 17:41:33.72ID:???
>>276
> 正規化にこだわって1対1なのに2つのテーブルに分けたら、
それは、何正規形にしようとして分割したんだ?
0285NAME IS NULL2015/05/13(水) 18:22:14.36ID:???
NoSQLとかKeyValueの形式が正規化だと思ってるフシがあるな
0286NAME IS NULL2015/05/13(水) 18:48:54.50ID:???
設計が難しすぎるんだよ。本も難易度高いし。
俺なんて10年MySQL使った実務してるけど、今でも悩みまくるもん。
1つの案件で3ヶ月は悩む。悩みすぎて仕事干されるレベル。
0287NAME IS NULL2015/05/13(水) 19:32:51.19ID:???
ある入門書に書いてあったけど、ある会社では意図的に正規化はしないわインデックスはこれまた意図的に貼らないとか。
世の中広いとおもた w
0288NAME IS NULL2015/05/13(水) 20:28:23.42ID:???
実務だと状況次第だとは思うけど、入門書に書く話じゃないような...
0289NAME IS NULL2015/05/13(水) 20:50:32.73ID:???
それでも動いてるサービスがあるってことだわな
0290NAME IS NULL2015/05/13(水) 22:23:28.15ID:P11X/PnA
データベース関係について語り合うならここがおすすめ。
よかったら、見てみて。
https://blngs.com
0291NAME IS NULL2015/05/14(木) 03:55:30.94ID:???
>>283
そうだよ。
「よくある」って体感してる人は、どのくらいの割合で遭遇するのか知りたいんだよ。

個人の範疇として聞きたいんだけど>>283は学習中を除いて>>276の状況に一度でもなったことがある?
0292隼人新聞社2015/05/14(木) 12:23:52.49ID:NhtWk18J
こんなにある、創価員による破壊的狂気的犯行の数々。実際には新聞TVにのらないだけでもっとある!次はあなたの番だ

●宅間守(在日部落)→大阪 附属池田小学校児童殺傷 。大量殺人犯 創価学会員の犯行 両親も創価学会員
 8人殺害 15人を殺傷。 朝鮮人部落出身。
●斉藤勇太→JR取手駅前バス無差別殺傷通り魔事件(取手バスジャック)  創価学会員の犯行
「通勤、通学客で混雑するバスの中で手加減せず無差別に襲っており、社会に大きな不安や衝撃を与えた結果は重大だ」 
●酒鬼薔薇聖斗→ 東慎一郎(在日)神戸の首切り魔で酒鬼薔薇聖斗 神戸の首切り魔。生首を校門に飾る。2人殺害。創価学会員の犯行 大量殺人犯
●福田孝行(在日)→山口県母子強姦殺害 殺害後屍姦、乳児も殺害 大量殺人犯 創価学会員の犯行。裁判では屍姦は
生き返らせるための(創価流の)儀式だと供述  死刑判決
● 大芦明 →2011年 11月5日 大阪府堺市中区 隣人二名殺害事件。創価学会員の犯行 無期懲役
●八木茂 →埼玉・保険金殺人事件犯人 2名殺害(平成12年)死刑判決 創価学会員の犯行
●武まゆみ→、埼玉・保険金殺人事件犯人 2名殺害(平成12年)無期懲役 創価学会員の犯行
●森田考子→埼玉・保険金殺人事件犯人 2名殺害(平成12年)共犯者で懲役13〜15年の判決 創価学会員の犯行 
●柏市連続通り魔殺傷事件X強盗殺人 創価学会員の犯行の犯行
●引寺利明 →マツダ宇品工場ファミリア暴走連続殺傷事件 引き殺しで1人死亡、11人を殺傷  創価学会員の犯行
●織原城二(金聖鐘) → ルーシー・ブラックマンさん事件 創価学会員の犯行 10人の女性に強姦又は強制わいせつ 内2人の女性が死亡
●山口芳寛 →熊本3才女児遺棄事件。レイプ 創価学会員の犯行。幼女に熱い視線、女児が大好き 強姦殺人無期懲役
●内柴正人→柔道金メダリスト(連続)強姦事件 (2009.5.15付 聖教新聞) 創価学会員の犯行
●アクリフーズ毒入り大量殺人事件 創価学会員の犯行
●リサイクルショップエース大量殺人事件 連続殺人!5人以上を殺して埋める 創価学会員の犯行
0293NAME IS NULL2015/05/14(木) 14:52:03.10ID:???
>>291
maji uzai
0294NAME IS NULL2015/05/14(木) 18:47:29.97ID:???
>>293
そんな反応を示すってことは、通常の設計から道を外れているからじゃないのかなぁ。
普通に設計してる人は、そんな状況にならんで終わる話だもの。
0295NAME IS NULL2015/05/14(木) 21:34:28.09ID:???
>>291
俺は知りたいとは思わないが?
0296NAME IS NULL2015/05/14(木) 22:05:02.81ID:???
>>294
横だけど、通常の設計から道外れてるから質問するんじゃないのか?
設計に自信持ってたら端から質問しないだろw
0297NAME IS NULL2015/05/14(木) 22:20:44.83ID:???
疑問にすら思わず自信もってて間違えてる奴腐るほどいるけどな
0298NAME IS NULL2015/05/14(木) 23:41:00.41ID:???
>>291
横だが
よくあるがどれくらいの頻度か分からんが、母数と割合がどれ位とか聴くのはアホかとは思うけどな
ちな、俺も珍しくはない頻度で見かけるわ

将来の拡張性を謳うもそもそも使わない、予算つかないがゆえ1対1の2テーブル等々(笑)
0299NAME IS NULL2015/05/15(金) 00:09:14.83ID:???
>>295
何であなたも知りたいでしょって言われたかのような反応をしてるんだろう。
そんなところに同意は求めていないよ。

>>296
>>276経験を語っているだけで質問をしているようには見えないよ。

>>298
そういう理由なら納得するよ。
その必要のない拡張性を事前に実装し、メンテし続けることで発生するコストを考えれば損だろうけれど。
0300NAME IS NULL2015/05/15(金) 01:15:31.50ID:???
単純に「1つのテーブルにカラムが20も30もあるとなんとなく嫌」
って理由で分けたくなる時がある。
この”なんとなく”って個人の主観でしか無いけど、割と重要な気がする。

んで、メンテし続けることで
「毎回JOINしてて面倒くさいよな」とか
「1つのテーブルでもそんなに使い勝手変わらないよな」
って気づいて一緒にしちゃうことも。
0301NAME IS NULL2015/05/15(金) 11:06:40.94ID:???
「理論から学ぶデータベース実践入門」読め
0302NAME IS NULL2015/05/15(金) 11:14:39.67ID:???
>>294
> 普通に設計してる人は、そんな状況にならんで終わる話だもの。
いやだから、普通に設計できないアホのこと知ってどうすんだよ?
そのアホの勘違いした俺理論でも聞いて、んでどうすんのさ?
0303NAME IS NULL2015/05/15(金) 14:42:12.10ID:???
「1つのテーブルにカラムが20も30もあるとなんとなく嫌」だから分割する、これが俺の正規化
↑
馬鹿
0304NAME IS NULL2015/05/15(金) 14:57:02.21ID:???
そうやって解説している書籍・サイトが結構あるけどな
0305NAME IS NULL2015/05/15(金) 15:09:08.74ID:???
そもそも「設計って難しいね」という>>276が、過去に設計手法を学んだとは思えないんだが。
0306NAME IS NULL2015/05/15(金) 15:10:44.12ID:???
設計手法を学んだらスラスラ簡単に設計できるようになるの?
学んでても案件や要件によって難しくなると思うけど
0307NAME IS NULL2015/05/15(金) 15:57:39.51ID:???
>>306
別に学ばずともリレーショナルモデルを構築できたり、正規化理論と同等のものを編み出せるならいいよ。
普通は学ぶ方が速いが。
0308NAME IS NULL2015/05/15(金) 16:12:37.02ID:???
またすごいのが沸いて居着いちゃたもんだ。
人間性をまず正規化してほしいね。
0309NAME IS NULL2015/05/15(金) 16:32:27.17ID:???
さぞ崇高な人間性をお持ちのようで
0310NAME IS NULL2015/05/15(金) 16:42:46.56ID:???
馬鹿しか沸かん
0311NAME IS NULL2015/05/15(金) 16:44:02.25ID:???
黙って「理論から学ぶデータベース実践入門」読め
0312NAME IS NULL2015/05/15(金) 17:00:39.30ID:???
居着いちゃったすごいのって俺のことかな。
0313NAME IS NULL2015/05/15(金) 17:15:44.24ID:???
俺のことだろ
0314NAME IS NULL2015/05/15(金) 17:54:03.81ID:???
>>300
> 単純に「1つのテーブルにカラムが20も30もあるとなんとなく嫌」
> って理由で分けたくなる時がある。
> この”なんとなく”って個人の主観でしか無いけど、割と重要な気がする。

そのなんとなくは、異なる二つのエンティティじゃないかと思うってことじゃないか?
だとしたら、正規化は関係ない。

一部のカラムの更新が激烈で性能要件が厳しい場合、正規化以外の理由で分割することもあるかもしれん。
俺はそういうのにはあたったことないから想像だが。
0315NAME IS NULL2015/05/16(土) 00:10:11.61ID:???
>>299
>そういう理由なら納得するよ。
何でお前みたいな知恵遅れを納得させないといけないんだよバーカ(笑)
0316NAME IS NULL2015/05/16(土) 02:34:31.57ID:???
無意味に煽る意味が分からん
0317NAME IS NULL2015/05/16(土) 03:31:25.38ID:???
>>276が頭ごなしに否定されたと思っておかしくなっちゃったとか?
他の人がわざわざ煽る理由はないもんね
0318NAME IS NULL2015/05/16(土) 11:51:57.29ID:???
>>317
>>315と>>298は俺で、>>276は他人な
なぜ一緒にしたがるのか…>>299が知恵遅れの馬鹿だからw
0319NAME IS NULL2015/05/16(土) 14:58:17.38ID:???
だからそういうのいらないだろ。
論理的に考えられるなら、どういうレスすればいいか分かるだろうに
0320NAME IS NULL2015/05/16(土) 18:24:36.50ID:???
アホw
0321NAME IS NULL2015/05/16(土) 18:42:17.07ID:???
なんだこれ
0322NAME IS NULL2015/05/21(木) 18:13:39.48ID:pzhWHvsu
家庭教師のバイトをしているのですが、
生徒の親御さんとやりとりするシステムを作ろうと思います。

要件は
・管理者(私とバイト仲間のAさん)と会員(親御さん)がログイン出来る会員制サイト
・1スレッド(質問)に対して、管理者と会員が投稿していく
・質問が解決すると、「済」になる(フラグ指定)
・投稿があるとメールが管理者と会員に送信される
・会員のプロフィール(傾向とか重視している科目とか)を設定したい

というのを構想しているのですが、テーブル設計で悩みます。
そんなに大きくするつもりはないのですが、以下のもので大丈夫でしょうか?
似たようなシステムを設計した事がある方がいましたら、アドバイス下さい。お願いします。

管理者テーブル、会員テーブル、会員プロフィール、
掲示板マスタ、掲示板メッセージ、メール送信テーブル
0323NAME IS NULL2015/05/21(木) 18:25:16.95ID:???
>>322
テーブル名だけじゃなくて、せめて主な項目ぐらい書けよ

>会員テーブル、会員プロフィール
とか、それぞれ何のテーブル何だ
>掲示板マスタ、掲示板メッセージ
もそれぞれ何持ってるテーブルかわからん
0324NAME IS NULL2015/05/21(木) 18:36:57.02ID:???
会員テーブルと会員プロフィールはわからんが、掲示板マスタはスレッド管理、掲示板メッセージはレス管理なんじゃないかな
0325NAME IS NULL2015/05/21(木) 18:42:02.79ID:???
>>322
ご自身で開発する理由はおありでしょうか?
もしなければ無料のサービスをお探しになられた方がよろしいと思いますよ
03263222015/05/21(木) 18:42:22.20ID:pzhWHvsu
>>323
すみません。以下の想定でいます。(書き方は過去レスを参考にしました)
掲示板マスタとメッセージのところは自信ないです。おかしくならないか心配です。

■管理者テーブル(質問を受ける講師)
ID|ログイン名|パスワード|権限|名前|自己紹介|登録日

■会員テーブル(質問をする人。主にログイン部分)
ID|メールアドレス|パスワード|登録日|削除フラグ

■会員プロフィール(質問をする人の詳細な情報。後から増やす予定)
会員ID|名前|性別|生年月日|住所|得意科目|苦手科目|管理者メモ

■掲示板マスタ(会員が管理者に質問する)
ID|会員ID|管理者ID|タイトル|内容|登録日|解決日

■掲示板メッセージ(会員が管理者に質問する内容)
掲示板マスタID|会員ID|管理者ID|内容|登録日|確認日

■メール送信テーブル(メッセージ投稿があるとメール送信)
ID|会員ID|管理者ID|送信日
03273222015/05/21(木) 18:45:16.50ID:???
>>325
結構親御さんから電話で質問されるのですが、
電話だけなので「言った・言わない」が発生して怒られる事があります。
ですので、簡単に投稿を管理できるものが欲しくて探していました。

無料サービスでは家庭教師向けの物がありません。
Web制作会社に依頼すると100万以上と言われたので、お金がないです。
仲間内と理解のある親御さんの間で使う予定なので、
簡易的でいいのですが、後からバージョンアップ出来るようなのを想定しています。
0328NAME IS NULL2015/05/21(木) 18:46:36.96ID:???
>>326
まぁ、一番気をつけるべきはセキュリティ。
個人情報満載のものを、全世界から参照可能なインターネットという場所に配置することのリスクはしっかり考えようね。
03293222015/05/21(木) 18:52:33.21ID:???
>>328
クローズドのサイトなので、知らない人がアクセスはないと思いますが、
SQLインジェクションやクロスサイトスクリプティングなど必要な対策はします。
それ以外で、DB設計について「セキュリティ的にこうすればいいよ」があれば教えて下さい。
0330NAME IS NULL2015/05/21(木) 18:55:10.05ID:???
>>329
どういうこと?会員のみが利用できるVPNでも作るのかな
03313222015/05/21(木) 19:06:41.80ID:???
>>330
>>322にも書きましたが、会員のみがアクセスできる会員制サイトです。
アクセス方法はPC・スマホからを予定しています。

ですので、設計の相談をお願いしたいのですが・・・
0332NAME IS NULL2015/05/21(木) 19:14:05.86ID:???
会員制サイトだから会員以外からのアクセスはないと思うあたりが駄目なんだけど、
そういうところを踏まえて100万は盛りすぎだけど、ある程度のお金がかかるもんなんですよ。

テーブル設計でいえば別にそれでいいんじゃないの。
メール送信テーブルはメール送信フラグとして会員テーブルか会員プロフィールに持たせてもいいかもね。

管理者IDがあちこちについてる理由がわからないけれど、何か意図があるんだろうから深追いしない。
0333NAME IS NULL2015/05/21(木) 20:29:47.93ID:rmOhpwWV
DB以外の部分でやることが多すぎて
設計はとりあえずどうでもいい部類
0334NAME IS NULL2015/05/21(木) 21:44:59.05ID:???
こんなんDB周りは気にすることもない
それよりWEB知識が豊富過ぎてヤバイ
0335NAME IS NULL2015/05/21(木) 23:27:19.03ID:???
まあ、WEB周りのセキュリティは範囲外の話なんで置いといて

ログインは管理者と会員でわけるのか?
管理者と会員と一つにのテーブルで良いんじゃないのか

掲示板マスタと掲示板メッセージも良くわからんな
両方に管理者IDとかあるけど、それ本当に両方に必要か?
1スレッドで複数の管理者向けの内容を混在させるのか?

メール送信テーブルも、その項目だけなら存在理由がわからん
メッセージを識別できるようにしないとダメなんじゃないのか
0336NAME IS NULL2015/05/22(金) 01:47:35.63ID:???
横だけど、テーブル設計が分からないって質問なのに、
「本当にそれで良いのか?」って聞いても本人は答えられないと思うぞw
0337NAME IS NULL2015/05/22(金) 08:56:53.90ID:???
管理者と会員のカラムが異なるのにひとつにまとめる意味が分からん
投稿者IDみたいなの作ればいいだけだろ
0338NAME IS NULL2015/05/22(金) 13:39:11.84ID:???
>>337
ユーザの一人が管理者になるのにね
0339NAME IS NULL2015/05/22(金) 14:41:58.54ID:???
>>338
いや、こんな感じじゃないか?
・佐藤さん(会員)がログインする
・掲示板で高橋講師に質問する

・鈴木さん(会員)がログインする
・掲示板で斉藤講師に質問する

・高橋講師がログインする
・自分宛の質問を確認する

・斉藤講師がログインする
・自分宛の質問を確認する

※講師と会員はログイン経路が違うんじゃないか。
※講師は掲示板で質問はしない(回答者する)
0340NAME IS NULL2015/05/22(金) 14:43:18.94ID:???
(誤) ※講師は掲示板で質問はしない(回答者する)
(正) ※講師は掲示板で質問はしない(回答はする)
0341NAME IS NULL2015/05/22(金) 14:44:35.06ID:???
すまん、アンカーも間違ってた。
>>335 宛てのコメント。
0342NAME IS NULL2015/05/22(金) 15:00:24.49ID:???
>>326を見る限り、ログイン方法自体が違うな。
管理者はログイン名とパスワードだけど、会員はメールアドレスとパスワードだ。
つまり会員種別で講師と生徒が分けるのではなく、テーブル要件そのものが違う。
これを1つにして、会員IDでメッセージ管理しろって無茶苦茶すぎる
0343NAME IS NULL2015/05/22(金) 20:47:30.78ID:???
>>342
> ・投稿があるとメールが管理者と会員に送信される
管理者もメールアドレス必要なんだから合わせればいいじゃん
0344NAME IS NULL2015/05/22(金) 22:26:54.71ID:???
>>343
合わせろって、>>326を引用するとこうしろってことか?

■利用者テーブル
ID|ログイン名|メールアドレス|パスワード|登録日

■管理者テーブル
ID|利用者ID|権限|名前|自己紹介

■会員プロフィール
ID|利用者ID|名前|性別|生年月日|住所|得意科目|苦手科目|管理者メモ

どうなんだこれ?逆にややこしくなってねーか?
会員が利用者テーブルに登録するとき、ログインIDがNULLになるんだぞ
0345NAME IS NULL2015/05/22(金) 22:28:14.30ID:???
間違えた。ログイン名がNULLになるだ。
0346NAME IS NULL2015/05/22(金) 23:35:24.51ID:???
管理者のログインIDがメールアドレスじゃいけない理由がない
0347NAME IS NULL2015/05/23(土) 00:05:08.46ID:???
パスワードバレバレやん
0348NAME IS NULL2015/05/23(土) 00:21:12.95ID:???
質問者が回答者のふりをしている可能性まで考えられるほど低レベル
0349NAME IS NULL2015/05/23(土) 03:20:03.20ID:???
では高レベルの設計を見せてやってはいかが
0350NAME IS NULL2015/05/23(土) 03:40:40.41ID:???
>>344
> 逆にややこしくなってねーか?
ややこしくしたのは誰なのやら
0351NAME IS NULL2015/05/23(土) 08:51:11.95ID:???
アカウント{ID, パス, 名前, メアド, 講師フラグ}
スレ{ID, 講師垢ID, 質問者垢ID, タイトル, 解決フラグ}
レス{スレID, 質問・回答内容}
0352NAME IS NULL2015/05/23(土) 10:06:12.46ID:???
>>351
レスの順序は重要だし、昔の話は意味がないとかもあるから、日時を入れた方がいい
0353NAME IS NULL2015/05/23(土) 11:29:13.36ID:???
>>351
誰がレスしたのか分からなくね?
0354NAME IS NULL2015/05/23(土) 11:33:44.21ID:???
ああ、質問と回答内容のカラムを1レコードに持って、スレIDから投稿者を判定か。
でも、編集とか削除はレスIDが無いと出来ないと思う。
日付はいらなくてもIDで昇順・降順出来るし。
0355NAME IS NULL2015/05/28(木) 00:45:10.42ID:f3gKlyUB
似たような構成のテーブルでも、用途が違えば複製して作った方が良いですかね?

なんか1つのプロジェクトに100以上のテーブルがあると
それだけで駄目な設計にされそうで、減らそうとしてしまいがちです。
typeとかstatusのカラムを作って同じテーブルで管理したり。
0356NAME IS NULL2015/05/28(木) 03:43:35.29ID:???
>>355
100以上の異なる要素って何なのかが気になる
0357NAME IS NULL2015/05/28(木) 11:34:09.03ID:???
>>356
マスタテーブルをDBに入れてると100以上は行きます。
郵便番号、都道府県、職業、連絡方法、支払い方法、配送方法、ステータス
などはよく使うのではないでしょうか。
0358NAME IS NULL2015/05/28(木) 11:38:51.83ID:???
7つしかないじゃん
0359NAME IS NULL2015/05/28(木) 11:40:53.77ID:???
>>358
全部書き出せというのですか?
0360NAME IS NULL2015/05/28(木) 11:57:27.40ID:???
そりゃ>>356氏の疑問に答えるなら全部だろ。
0361NAME IS NULL2015/05/28(木) 12:48:35.94ID:???
>>355
「テーブルを減らすとダメな設計ではなくなる」と、
どうして思ったのかをまずは説明してみよう
0362NAME IS NULL2015/05/28(木) 13:00:49.82ID:???
>>360
でも、それは私が教えて欲しいこととは違いますよ?

>>361
単純に視認性が良くなる、テーブル構成が把握しやすく、
開発時のバグや不具合のリスクを減らせると思ったからです。
0363NAME IS NULL2015/05/28(木) 13:26:48.28ID:???
減らさなくて大丈夫だから安心していいよ
0364NAME IS NULL2015/05/28(木) 14:00:08.44ID:???
>>362
> 開発時のバグや不具合のリスクを減らせると思ったからです。

ひとつ言えることは、typeとかstatusとかflagとか入りのテーブルが多くなればなるほど、
開発時のバグや不具合のリスクは高くなるよ。
0365NAME IS NULL2015/05/28(木) 14:35:13.59ID:???
>>355
『SQLアンチパターン』読むのがお薦め。
0366NAME IS NULL2015/05/28(木) 14:50:19.56ID:???
>>362
別に君への説明のためじゃなくて疑問に思ったから聞いてみただけだろ。
100以上が嘘だと思ってるから疑問に思っただけで、答えたくなけりゃ答えなくていいんだよ。
0367NAME IS NULL2015/05/28(木) 15:04:24.42ID:???
テーブル数が100超えるようなシステムも無いとは言わないけど
そんなシステムのDB設計にかかわるような奴が
こんなとこでそんな質問するとも思えんしな
0368NAME IS NULL2015/05/28(木) 15:10:43.56ID:???
テーブル100個なんて、直交した機能が20個もあれば楽勝で超す
0369NAME IS NULL2015/05/28(木) 15:12:48.05ID:???
>>364
大変ためになるご意見ありがとうございます。
statusやflagは主に有効・無効で使うのですが、
typeはそのデータの種類を現すときに使う場合が多く、
そうなるとおっしゃるように開発時のバグや不具合のリスクは高くなりますね。

というわけでやはりテーブルを分けます。
あと、>>365も見てみます。ご意見ありがとうございました。
0370NAME IS NULL2015/05/28(木) 15:42:12.67ID:???
>>369
> statusやflagは主に有効・無効で使うのですが、
その有効・無効にstatusやflagを使うのが良くない場合がある。
ちょっと前にWebで論争になったりした。(「削除フラグ」でググる)

また、この話は『理論から学ぶデータベース実践入門』でも詳しく解説されている。
http://gihyo.jp/book/2015/978-4-7741-7197-5
の目次参照。
> 第9章 履歴データとうまく付き合う
0371NAME IS NULL2015/05/29(金) 18:39:41.87ID:???
マスターテーブルの場合、共通化してもいいと思う。

id:option_name:option_value:sort
1|pref|北海道|1
2|pref|青森県|2
・・・
50|payment|銀行振込|1
51|payment|郵便振替|2

みたいな。wordpressがこんな事してる。
0372NAME IS NULL2015/05/30(土) 02:23:42.08ID:???
>>371
あり得ない例えだと説得力ない(笑)
0373NAME IS NULL2015/05/30(土) 11:42:13.78ID:???
>>372
「wordpressがこんな事してる」ってあり得る話してるのに、あり得ない例え????
0374NAME IS NULL2015/05/30(土) 13:30:37.27ID:???
>>371
質問です。
その例ではprefがoptionカラムにありますよね。その例ではそうそう増えることは確かにないでしょうけど、
1から49までの間に収まっている保証がないものだったらどうするんです?

続いているやつを後ろにずらす?
当然プログラム側でも対応が必要になりますよね
0375NAME IS NULL2015/05/30(土) 14:10:48.10ID:???
>>374
ID番号が1〜49に納まってるかどうかなんて関係ないよ。
マスタデータとして、1つのテーブルで共通となる値を管理するって仕様だから。
疑問に思うならwordpress見ればいいだけじゃん。
0376NAME IS NULL2015/05/30(土) 14:20:27.30ID:???
いいや。どうせ見ないだろうし。

# 都道府県を選択させるデータがほしい
SELECT optin_name,option_value FROM options WHERE option_name='pref' ORDER BY sort

このSQL文から「都道府県だけのデータ」を抽出できるよね?
後はPHPを使ってHTMLの選択リストを作成するときは

echo '<select name="pref">';
while($row = mysql_fetch_array($result)) {
echo '<option value="' . $row['id'] . '">' . $row['option_value'] . '</option>';
}
echo '</select>';

こうやればいいだけじゃないの。
都道府県を後から追加しようがIDが変わるだけだし、何が問題かわからん。
0377NAME IS NULL2015/05/30(土) 14:52:46.58ID:???
そうでした
0378NAME IS NULL2015/05/30(土) 14:59:39.81ID:???
一生懸命書いたのに、一言レスで終わる切なさ・・・
0379NAME IS NULL2015/05/31(日) 01:56:58.12ID:???
>>371
限定的な用法だけどありだよね。
10レコードにも満たないテーブルを選択肢ごとにたくさん作るよりいい。
0380NAME IS NULL2015/05/31(日) 09:55:36.88ID:???
>>373
キーワードや各種設定値ならありだけど、完全な固定の都道府県を混ぜ混ぜするのはどうかと思うわ
0381NAME IS NULL2015/05/31(日) 13:59:03.47ID:???
>>380
それはそれで意味のわからん設計思想だな
0382NAME IS NULL2015/05/31(日) 16:39:24.43ID:???
>>381
一度入れればまず更新が無いだろ
上のマスターは色々ありそうだし
0383NAME IS NULL2015/05/31(日) 17:05:41.82ID:???
>>382
いや、だから更新するものと更新しないものを別々にしたい意図がわからん
超でかいテーブルでインデックスの更新したくないとかならまだわからんでもないが...
0384NAME IS NULL2015/05/31(日) 18:10:39.40ID:???
郵便番号テーブルなら分かる。件数も多いし、変わることも多い。
でも、都道府県やら性別やら元号やらは同じテーブルで管理すればいいよ。
それに都道府県の場合、変わる可能性ないって言うけど、
英語サイト用に「東京都→TOKYO」にしたい場合、更新する可能性もあるじゃん。
0385NAME IS NULL2015/06/01(月) 00:46:50.40ID:???
汎用テーブルか、誰でも一度は通る道ね
0386NAME IS NULL2015/06/01(月) 09:32:16.82ID:???
汎用テーブルにぶちこんで、InnoDB memcached プラグイン
で爆速読み書きしようという崇高な思想があるんですね、わかります。
0387NAME IS NULL2015/06/01(月) 10:19:11.45ID:???
よくりかいできました
0388NAME IS NULL2015/06/01(月) 13:51:19.72ID:???
性別や元号とかプログラム埋め込みでええやん
0389NAME IS NULL2015/06/01(月) 15:48:34.63ID:???
>>388
性別は増えることはないだろうけど、元号は確実に増えていくので、プログラム埋め込みだと元号が変わったら、プログラム変更必須になりますよね。
0390NAME IS NULL2015/06/01(月) 16:33:12.31ID:???
>>389
元号が変わることを予測したシステムを作るなんてとんでもない。
という考えの時代に生きている人かもしれない。
0391NAME IS NULL2015/06/01(月) 16:42:37.97ID:???
まあ固定もんは設定ファイルにでも持っとけ
って考え方もあるにはある
0392NAME IS NULL2015/06/01(月) 16:54:14.97ID:???
>>389
> プログラム埋め込みだと元号が変わったら、プログラム変更必須になりますよね。
変更すればええやん
0393NAME IS NULL2015/06/01(月) 16:55:00.20ID:???
>>389
> 性別は増えることはないだろうけど、
性別も男/女固定とは限らない
0394NAME IS NULL2015/06/01(月) 17:00:45.25ID:???
西暦でええやん
0395NAME IS NULL2015/06/01(月) 17:40:17.89ID:???
汎用テーブル云々言う奴は、外部キー一切使わないのかな
0396NAME IS NULL2015/06/01(月) 18:38:23.19ID:???
表示方法変えたい時もあるじゃん。
男→Man、男の子、ボーイ
女→Woman、女の子、ガール

とかさ。プログラムだと毎回設定ファイルいじる気か?
0397NAME IS NULL2015/06/01(月) 18:51:16.57ID:???
汎用テーブルだと脊髄反射してる人がいるけど、
少し考えればよく問題になるいわゆる汎用テーブルではないことに気づけそうなもんだが。
0398NAME IS NULL2015/06/01(月) 23:40:16.35ID:???
汎用テーブルとは違うけど、ログインに関するテーブルを会員の種類分作成していた時、
先輩から「お前、会員が増える事にテーブルを増やす気か?」って言われて
1つのテーブルにまとめ直した事がある。>>371みたいな設計ではないけど。
0399NAME IS NULL2015/06/02(火) 00:03:07.09ID:???
>>396
論理的に使うのと表示じゃ違うから、原則性別(男1,女2,無0)フラグと表示(男、Man)は分ける
0400NAME IS NULL2015/06/02(火) 01:16:44.84ID:???
>>399
そしたら汎用テーブルの必要ないな
0401NAME IS NULL2015/06/02(火) 03:01:44.50ID:???
>>398
共通項をくくりだしただけではなくて?
0402NAME IS NULL2015/06/02(火) 05:15:15.83ID:???
会員の種類ってのがどの程度の違いがあるかによるけど
会員の種類が増えたら、テーブル増やすとかはありだと思う
まさか、利用者が10人から11人になったらテーブル増やすとか言うわけじゃあるまい

ただし、それと全会員共通でログインを管理するテーブルを持つかどうかは別の話
0403NAME IS NULL2015/06/02(火) 05:36:17.68ID:???
>>400
性別フラグや各種フラグ、表示文字の設定用で使うのはありかと
個人的には国内限定仕様だと都道府県は専用テーブルにするが
0404NAME IS NULL2015/06/02(火) 08:55:10.78ID:???
>>393
増えないとは、言ったけど、それが男/女だけとは言ってない件
0405NAME IS NULL2015/06/02(火) 10:15:59.42ID:???
>>404
いや、俺も2個固定じゃなくて増え得るって言ったつもりなんだが
0406NAME IS NULL2015/06/02(火) 11:17:52.57ID:???
>>402
言いたいことがよくわからないのだが、
会員=ログイン情報持ってるわけだろ?
なのに、「全会員共通でログインを管理するテーブルを持つかどうかは別問題」ってどういう意味?
いつログイン/ログアウトしたとかの記録をとるログテーブルを持つかどうかってこと?
0407NAME IS NULL2015/06/02(火) 11:54:03.62ID:???
>>406
会員の種類が異なると、その属性集合が異なる場合があって、それを別テーブルにするとかいうことでしょ。
0408NAME IS NULL2015/06/02(火) 12:24:57.25ID:???
>>407
ごめん。理解できない。
有料会員/無料会員とあって、それを別テーブルにする
って事でもないよな?こういう場合は1テーブルにしてるはず。
0409NAME IS NULL2015/06/02(火) 12:43:55.18ID:???
>>408
> 有料会員/無料会員とあって、それを別テーブルにする
そういうことだが。

> 1テーブルにしてるはず
なんで「はず」なんだ。
0410NAME IS NULL2015/06/02(火) 12:56:54.80ID:???
>>408
有料会員にしか属さない情報をどう管理するかって話だよ。
0411NAME IS NULL2015/06/02(火) 13:08:08.12ID:???
安心のNULL
0412NAME IS NULL2015/06/02(火) 13:11:50.97ID:???
>>405
男/女/不明/その他
くらいじゃないの?増えるというのは?
0413NAME IS NULL2015/06/02(火) 13:12:26.99ID:???
>>409-410
無料→有料(またはその逆)になる場合、いちいちテーブル移動するのか?
0414NAME IS NULL2015/06/02(火) 13:20:43.08ID:???
さすがにこういう事だろ?

会員属性テーブル:ID、属性名
会員テーブル:ID、会員属性ID、ログイン名、パスワード

この会員属性テーブルに、無料と有料を用意して
会員テーブルで結合するって話なだけだろ。さすがに。
0415NAME IS NULL2015/06/02(火) 13:27:56.49ID:???
>>408
こう言うことだろ

ログイン情報テーブル(Id, ログインId, パスワード情報, ...)
有料会員情報テーブル(Id, 有効期限, 支払方法, ...)
無料会員情報テーブル(Id, ...)
0416NAME IS NULL2015/06/02(火) 13:39:11.11ID:???
>>415
いや、だからその場合は無料から有料会員になったらどうするのよ?
無料会員情報テーブルのレコード消して、有料会員情報テーブルの方に追加して・・・
って処理が発生していいのか?

あと、有料会員が投稿したデータとかはどうなるんだよ?
投稿じゃなくても何か購入とかでもいい。
「5月は無料会員でした。6月は有料会員になりました。7月は無料会員に戻りました」
ってケースの場合、その設計だと破綻するだろ。
0417NAME IS NULL2015/06/02(火) 13:42:21.44ID:???
頭固い奴多いな。
どういうパターンもあり得るだろ。
対象ドメインなしに、「こういうことだろ」みたいな話をしても意味ない。

> 無料→有料(またはその逆)になる場合、いちいちテーブル移動するのか?
無料会員と有料会員を別テーブルにするという選択をしたなら、そうするだろ。
0418NAME IS NULL2015/06/02(火) 13:44:16.96ID:???
>>416
> 「5月は無料会員でした。6月は有料会員になりました。7月は無料会員に戻りました」
> ってケースの場合
正気か?
その場合は、これまでのどの設計でもダメだろ。
0419NAME IS NULL2015/06/02(火) 13:50:56.73ID:???
>>418
正気か?ってこういう事が起きないとでも?

起きる可能性があるから、>>415の設計だと破綻するだろって言ってるんだが。
0420NAME IS NULL2015/06/02(火) 13:52:19.57ID:???
ユーザのグレードがころころ変わるのなら、
member_grades: {member_id, from_date, to_date, grade}
とかも考えられる。
(to_dateがあるのは良くない派もいる)
0421NAME IS NULL2015/06/02(火) 13:55:55.59ID:???
>>419
> 正気か?ってこういう事が起きないとでも?
起きる場合もあるだろうな。

> >>415の設計だと破綻するだろって言ってるんだが。
>>415の設計も破綻するが、これまでのどの設計も破綻する。
その意味で、

> 「5月は無料会員でした。6月は有料会員になりました。7月は無料会員に戻りました」
> ってケース
みたいな話を持ち出すのは正気かって言ってるんだが。
頭悪すぎだろ。
0422NAME IS NULL2015/06/02(火) 14:05:18.95ID:???
アホばっかだな。

>>416
> いや、だからその場合は無料から有料会員になったらどうするのよ?
そういう要件があるなら、最初からそれ込みで設計するだろ。

要するに、要件なしであれこれ言っても意味ない。
「有料/無料会員のモデリングの一般解」なんか存在しない。
0423NAME IS NULL2015/06/02(火) 14:16:12.51ID:???
>>416
> って処理が発生していいのか?
いいだろ?
なにか問題なのか?

> ってケースの場合、その設計だと破綻するだろ。
購入履歴テーブルとか作ればいいだけだろ
0424NAME IS NULL2015/06/02(火) 14:41:16.15ID:???
アホばっか、じゃなくて>>406一人だと思うんだ。
0425NAME IS NULL2015/06/02(火) 14:42:49.90ID:???
>>421
喧嘩するつもりがないならまじめに自分のレスを見返せ。

>起きる場合もあるだろうな。
って可能性を認めてるのに

>みたいな話を持ち出すのは正気かって言ってるんだが。
って無茶苦茶だろ。自分が何言ってるかわかってるのかよ。
0426NAME IS NULL2015/06/02(火) 14:46:48.25ID:???
>>423
じゃあ聞くが、>>415の設計に購入履歴テーブル追加出来る?
机上の空論じゃなくて、出来るなら見本見せてよ。
0427NAME IS NULL2015/06/02(火) 15:07:34.97ID:???
>>426
横だけども。
購入履歴はユーザにひもづくよね。
ユーザが有料会員無料会員になろうが、ユーザIDは変わらないよ。

> 有料会員情報テーブル(Id, 有効期限, 支払方法, ...)
> 無料会員情報テーブル(Id, ...)
これのIdは個別のサロゲートキーではなく、ログイン情報テーブル.Id。

>>415がそうじゃないって言ったら俺にはどうしようもないけど。
0428NAME IS NULL2015/06/02(火) 15:11:50.02ID:???
>>425
> って無茶苦茶だろ。自分が何言ってるかわかってるのかよ。
設計Aと設計Bに対して、設計Aなら実現できる事象Xを持ち出すのならともかく、
設計Aでも実現できない(というか、それまで話題にすらなっていない)事象Xに
設計Bは対応できないじゃないか、というロジックは頭悪いって言ってるんだが。

>>426
> >>415の設計に購入履歴テーブル追加出来る?
だーかーらー、購入履歴を管理するという要件があるなら、最初からそういう設計にするんだって。

> 要するに、要件なしであれこれ言っても意味ない。
ということだ。
0429NAME IS NULL2015/06/02(火) 15:23:58.70ID:???
なんか、個人向けショッピングサイトの会員みたいなものだという先入観で話してないか?

「種類の違う会員」の例としては、「個人会員/法人会員」みたいな違いがある場合もある。
そういう場合は、別テーブルにするのもありじゃないか?
0430NAME IS NULL2015/06/02(火) 15:27:15.61ID:???
>>428
頭固いんだな。ここは設計を相談するスレだろ?
じゃ、AだろうとBだろうと起こりうる問題に対して
「こういう場合は無理がある」って指摘する事の何がおかしいだよ。
自分の枠に当てはまらなければ、他人の意見は受け付けないのかよ。

>> 要するに、要件なしであれこれ言っても意味ない。
>ということだ。

言いたい事はわかる。でも、俺含め他のやつも「無いことに対する想定」
を話してるんじゃないのかよ。誰かが要件をだしてるわけじゃないんだから。
じゃ、誰かが「俺はこう思う」って出して案に対して、誰かが「それはおかしくね?」
って指摘する事の何がおかしいか分からん。それがおかしいなら話にならないだろ。
0431NAME IS NULL2015/06/02(火) 15:31:50.11ID:???
>>429
会員に関連するテーブル(問い合わせ、退会申込、パスワード再請求など)
のテーブルも会員の数だけ作るのか?
0432NAME IS NULL2015/06/02(火) 15:33:54.22ID:???
>>428
> >>426
> > >>415の設計に購入履歴テーブル追加出来る?
> だーかーらー、購入履歴を管理するという要件があるなら、最初からそういう設計にするんだって。

>>427じゃだめなん?設計変えないとまずいん?
0433NAME IS NULL2015/06/02(火) 15:35:12.98ID:???
>>431
> 会員に関連するテーブル(問い合わせ、退会申込、パスワード再請求など)
> のテーブルも会員の数だけ作るのか?

君の考える
* 問い合わせ
* 退会申込
* パスワード再請求
のテーブル定義を書いてくれ。

一体何を質問されているのかわからない。
0434NAME IS NULL2015/06/02(火) 15:37:03.10ID:???
>>429
テーブルの実装としてはおよそ3パターンに分かれるかと。
・別テーブルにする
・共通項をくくりだして、個々に属性情報テーブルを用意する
・1テーブルでNULL使う

これっていつも問題になりがちで、常に正解といえるパターンはないものの典型じゃないかな。
0435NAME IS NULL2015/06/02(火) 15:39:39.58ID:???
>>430
> 誰かが要件をだしてるわけじゃないんだから。

そう。
だから、「それはこういう要件に対応できない」の「こういう要件」を後出して次から次に出していくと際限が無いのでは?

この一連の話は、
>>402
> 会員の種類ってのがどの程度の違いがあるかによるけど
> 会員の種類が増えたら、テーブル増やすとかはありだと思う
から始まっていて、その結論は、そういう場合もあるよね、で終わりだと思うんだが。
0436NAME IS NULL2015/06/02(火) 15:42:00.78ID:???
>>434
> テーブルの実装としてはおよそ3パターンに分かれるかと。

うん、どれもありえる。
で、「別テーブルにする場合もあるよね」と言ったら、>>431のような返しをされて困惑している。
0437NAME IS NULL2015/06/02(火) 15:43:09.74ID:???
>>433
君は、>>429で「個人会員/法人会員みたいな違いがあるから、別テーブルにするのもありじゃないか?」っと提言してるよね?

で、俺は「会員として使うテーブルも分ける事になるけど良いのかな?」と思ったわけだ。

* 問い合わせ
個人だろうと法人だろうと「管理者に質問」するケースは多々あるよね?
カラムは「件名・内容」とか「用件(カテゴリ選択)・内容」が多いと思う。
もちろん、個人と法人で全くフォームの内容が異なるなら2つに分けるべきだろうけど、
そうでない場合は、1つでも良いんじゃないかな?とは思う。

* 退会申込
これは単純だね。退会した日と理由を保管するテーブルだね。

* パスワード再請求
これもよくあるね。ワンタイムパスワードみたいな仮パスワードを送信するとか、
新しいパスワードを設定するためのトークン発行するとか。

会員の種類毎にテーブルを分けるということは、
これらよく使用するテーブルも分けるって事になってもいいの?って指摘だよ。
もちろん、要件によるのは確かだけど。
0438NAME IS NULL2015/06/02(火) 15:44:50.36ID:???
>>436
困る必要ないと思うんだよ。
3パターンに分かれるということは、それだけ考える余地があるということ。

「こういうメリット/デメリットが有るよ」って指摘に対して
そこで困って思考停止するなら、設計の話なんて出来ないよ。
0439NAME IS NULL2015/06/02(火) 15:49:07.15ID:???
>>437
もういいだろ
0440NAME IS NULL2015/06/02(火) 16:04:55.70ID:???
>>437
そういう内容だったら、分ける必要ないと思うけど。

どうして
> 会員として使うテーブルも分ける事になる
と思うんだろう?
04414342015/06/02(火) 16:07:05.83ID:???
今日はすげえな。

>>436
>>431に対しては、まさかwと返事するのが妥当。

てか、>>437で引き継いでるのか。
> 会員として使うテーブルも分ける事になる
それは法人会員、個人会員でIDが重複するような設計の場合でしょ。
そのパターンはさすがに考えてなかったな。
0442NAME IS NULL2015/06/02(火) 16:07:32.32ID:???
>>438
> 「こういうメリット/デメリットが有るよ」って指摘に対して

それが本当に「デメリット」なら議論する意味もあるんだが、誰も想定していない要件に対応できて
いないというのは「デメリット」ではないのでは?
0443NAME IS NULL2015/06/02(火) 16:11:02.09ID:???
会員の属性を保存するテーブルと、ログイン情報を保存するテーブルが一つであるとは限らない
0444NAME IS NULL2015/06/02(火) 16:12:56.20ID:???
>>440
個人会員テーブル
法人会員テーブル

の場合で、お問い合せテーブルを分けない場合、
お問い合せテーブル内のカラムは、個人会員IDと法人会員IDが存在して、
どちらかがNULLになるんだけど、そういう想像もつかない?
それとも俺が知らない別の設計があるというなら教えてくれ。

>>442
確かにそう。言葉が悪かった、すまん。
ただ、提案者がいて、第三者(俺)が「こういう場合はどうするの?」
って指摘したことに対して、煽り扱いするのは変じゃね?とは言いたい。
その時点で考える事を放棄してるじゃん。話し合いにならない。

誰かと話したくないなら自分のブログに書けばいいんだよ。
掲示板で意見を述べてる以上は、他人から指摘があっても受け入れろよ。
俺は別に自分が正しい・正しくないを主張してるわけじゃない。
04454342015/06/02(火) 16:14:33.24ID:???
>>444
会員種類が増えるたびにあちこちのテーブルにカラムを追加するはめになるような設計はご勘弁。
0446NAME IS NULL2015/06/02(火) 16:17:06.65ID:???
>>445
だろ?おかしいよな。
だから俺は会員毎にテーブルを分けるのは「おかしい」って言ってるんだよ。
0447NAME IS NULL2015/06/02(火) 16:20:06.99ID:???
>>444
> お問い合せテーブル内のカラムは、個人会員IDと法人会員IDが存在して、

法人会員ID=ログインユーザID
個人会員ID=ログインユーザID
と考えてるんだね。

法人会員IDとログインユーザIDは別にすればいいんじゃないかな。
04484342015/06/02(火) 16:23:17.82ID:???
>>446
おかしくない場合もあると俺は思うので、ありがちなパターンとして3つ上げた。
そしてそのどれも駄目だとは言っていない。
0449NAME IS NULL2015/06/02(火) 16:24:46.74ID:???
法人会員テーブル(法人会員ID、法人固有の属性)
個人会員テーブル(個人会員ID、個人固有の属性)
認証情報テーブル(ログインユーザID、パスワード等)
法人会員-認証情報の連関テーブル(法人会員IDとログインユーザID)

みたいな感じかな。
0450NAME IS NULL2015/06/02(火) 16:25:23.50ID:???
>>447
ということはだよ、

ログインテーブル=>個人会員テーブル
ログインテーブル=>法人会員テーブル

みたいな感じだ。(文字でER図は書けないけど・・・)
んで、お問い合わせテーブルにはログインIDが存在すると。
(お問い合わせテーブルを1つでまとめる場合ね)

で、この時にも疑問が生じる。
「テーブル見ただけでは、どの会員がお問い合わせしたか分からないのでは?」

もちろん、
お問い合わせテーブル=>ログインテーブル=>個人会員(法人会員)

と、結合していけばどの会員のお問い合わせかは判別できるけどね。
0451NAME IS NULL2015/06/02(火) 16:26:57.85ID:???
>>448
君が出した>>434の3パターン自体はおかしくないよ。誰もが思うこと。
俺は>>429も>>431と突っ込んだだけだから。
0452NAME IS NULL2015/06/02(火) 16:32:57.55ID:???
>>450
> と、結合していけばどの会員のお問い合わせかは判別できるけどね。

問い合わせに対応するときに、会員の属性が必要なら、そうすればいいんじゃないかな。

逆に聞くけど、一つにまとめると
会員テーブル(会員ID、法人/個人に共通な属性・・・、法人のみの属性・・・、個人のみの属性・・・)
となるけどそうするの?
0453NAME IS NULL2015/06/02(火) 16:40:17.99ID:???
>>452
>>450にも書いたけど、テーブルやカラムを過度に増やさないなら、

ログイン認証テーブル
└個人会員テーブル(性別とか年齢とか)
└法人会員テーブル(会社名とか担当者名とか)

とするだろうね。仮に別の会員が増えても属性テーブルを増やせばいいだけだし。
ただ、その場合は>>450の後半に書いたような疑問は生じるけど。
0454NAME IS NULL2015/06/02(火) 16:44:51.52ID:???
>>453
え、それを「個人会員テーブルと法人会員テーブルは別にする」と言ってたんだけど・・・

今まで使った時間は・・・
0455NAME IS NULL2015/06/02(火) 16:49:07.28ID:???
>>454
でも、>>453やら>>449みたいな情報を>>431で突っ込んだ後に出せてないよね?
>>429の情報だけじゃ、>>431みたいな疑問が生まれても仕方ないと思うんだけど。

そこからここまで話し合ったから、
「こういう設計のやり方を導き出せる」ってなったわけじゃん。何も時間を無駄にしてないよ。
「いや、俺はこういうつもりだった」っていうなら最初からちゃんと書こうよ。
0456NAME IS NULL2015/06/02(火) 16:49:12.55ID:???
>>445,446
「会員種類が増える」ことを、設計時想定済みの通常運用内とみなすか
仕様変更だとみなすかによって話は全く違う

>>450
>テーブル見ただけでは、どの会員がお問い合わせしたか分からないのでは?
>お問い合わせテーブル=>ログインテーブル=>個人会員(法人会員)
>と、結合していけばどの会員のお問い合わせかは判別できる
自分自身で疑問は解決してるように見えるが?
すくなくともRDB前提なら単一テーブルでデータが完結してる必要なんてないわけだが
なんならテーブル=>ログインテーブル=>個人会員(法人会員)でビュー作っとけよ
0457NAME IS NULL2015/06/02(火) 16:51:08.17ID:???
>>455
いや、>>429=>>449なんですが・・・

もういいです・・・
0458NAME IS NULL2015/06/02(火) 16:52:31.46ID:???
>>457
だから、それを最初に書けって話なの。
後から突っ込まれたから後出して「俺はこういうつもりだった」ってのは卑怯だろ。
0459NAME IS NULL2015/06/02(火) 16:54:19.98ID:???
>>458
いや、さすがにみんな>>449くらいのことは前提としてると思ってたんで・・・

念のため書いただけだし・・・
0460NAME IS NULL2015/06/02(火) 16:57:52.37ID:???
お前>>406じゃねーの?
お前以外、全員わかってたぞ。

>>402
> 会員の種類ってのがどの程度の違いがあるかによるけど
> 会員の種類が増えたら、テーブル増やすとかはありだと思う
>
> ただし、それと全会員共通でログインを管理するテーブルを持つかどうかは別の話

>>406
> 言いたいことがよくわからないのだが、
> 会員=ログイン情報持ってるわけだろ?
0461NAME IS NULL2015/06/02(火) 16:59:15.01ID:???
>>459
じゃあさ、>>431で突っ込んだ後に、>>433でほじくり返したんだ?
「一体何を質問されているかわからない」って書いてるじゃん。

>>431みたいなケースも考えられるから、
>>449みたいな設計が前提としてあるのは当然って反論はおかしいだろ。

>>431やら>>437やら>>444なら(全部俺が投稿した)の考えが及ぶから、
>>449みたいな設計が思いついたんだろ。

それを最初から前提とするべきってのは少々横暴だわ
0462NAME IS NULL2015/06/02(火) 17:01:54.91ID:???
>>460
待て待て。
お前以外全員わかってた=全員>>449やら>>453に書いたような
会員テーブルとは別に共通のテーブル(ログインテーブル)を持つやり方を知っていた。

というなら、>>453を書いた俺はどうなんだよw知らないと書けないだろうが。
0463NAME IS NULL2015/06/02(火) 17:02:25.51ID:???
>>461
> >>449みたいな設計が思いついたんだろ。
お前以外は全員思いついてたわ
つか、常套手段
0464NAME IS NULL2015/06/02(火) 17:03:36.32ID:???
>>462
じゃお前は一体なんに反論してたんだよ?
別テーブルにする場合もある論にいちいち反論してんじゃねーよ
0465NAME IS NULL2015/06/02(火) 17:03:46.85ID:???
>>463
>>462を見ろ。
0466NAME IS NULL2015/06/02(火) 17:04:30.48ID:???
>>464
反論するなって言うなら会話にならないって何度も投稿してるだろうが。
お前は自分の考えのみ認めてもらえないなら、他人の意見は一切受け付けない人間か?
0467NAME IS NULL2015/06/02(火) 17:09:50.49ID:???
>>461
べつにお前を貶めようとか思ってるわけじゃないんだが
ほとんどの人は>>402の段階で>>449程度までは考えが及んでると思うんだ

だからお前の質問はかなり無碍な回答をされてるわけだが
それを横暴だっていうならまあそうかもしれん。ただ傲慢なだけだけど
0468NAME IS NULL2015/06/02(火) 17:12:11.94ID:???
>>429
> 「種類の違う会員」の例としては、「個人会員/法人会員」みたいな違いがある場合もある。
> そういう場合は、別テーブルにするのもありじゃないか?

>>431
> 会員に関連するテーブル(問い合わせ、退会申込、パスワード再請求など)
> のテーブルも会員の数だけ作るのか?

どうみても「別テーブルにするのもあり」の反論だと思うんだが。

で、最終的にお前はどうするんだと聞かれて、
>>453
> ログイン認証テーブル
> └個人会員テーブル(性別とか年齢とか)
> └法人会員テーブル(会社名とか担当者名とか)

どういうこと?
一貫性がないんだが。
0469NAME IS NULL2015/06/02(火) 17:14:29.65ID:???
>>467
まず2つ言いたい事がある。
「ほとんどの人は」と決めつけるな。知らない人もいるし、疑問を持つ人もいる。
みんな同じ、みんな知ってて当たり前の価値観は危険だぞ。

もう一つ。このスレは「DB設計を語るスレ」だ。
「ぼくのかんがえたせっけいをみんなだまってうけいれてくれるすれ」じゃないだよ。
他人から何かしらツッコミやら反論があって当然なんだよ。
そいつが知ってるかどうかは別で。

だから自分が書いたレスには責任を持って答えろよ。
どうせ2ちゃんだしどうでもいいやと責任放棄したいなら無視しろ。
わざわざ反論に反論重ねるからボロが出る。
0470NAME IS NULL2015/06/02(火) 17:15:38.75ID:???
>>469
いーや、このスレの流れ的に「お前以外は全員わかってた」と断言するね
0471NAME IS NULL2015/06/02(火) 17:15:54.46ID:???
>>468
反論なんじゃなくて、純粋な素朴な疑問なんだととらえようぜ

まあ、ここは語るスレだから好きに語ればいんだけど
みんなもうちょっと初心者に優しくしようぜ
0472NAME IS NULL2015/06/02(火) 17:19:09.02ID:???
>>468
431と437と444と446と450を見てから>>453を見てくれ。
自分で疑問投げかけてほぼ自分で答えを導き出したようなもんだw

でも、本来は>>429が>>431への回答として出すべきだとは思うがな。
0473NAME IS NULL2015/06/02(火) 17:20:16.28ID:???
>>472
> 自分で疑問投げかけてほぼ自分で答えを導き出したようなもんだw
やっと白状したか
お前以外は最初から全員わかってたんだ、バーーカ
04744672015/06/02(火) 17:22:22.83ID:???
>>469
お前が俺を誰と勘違いしてるか知らんが
>自分が書いたレスには責任を持って答えろよ
責任もって答えるわ
>>467のほとんどの人ってのは>>461に無碍な回答をしてた人のことな
俺は反論やツッコミがある事に何も言ってないよ
むしろお前と同じであって当然だとおもってる
ただ、知らない人間の発言に、知ってる人間がきつい言葉で対応してるって言ってるだけ
0475NAME IS NULL2015/06/02(火) 17:23:09.57ID:???
>>473
白状?おかしな奴だな。
最初から>>429へツッコミしてるって書いてるのに。

お前みたいな人格攻撃しか出来ない幼稚な奴は
自分の意見も出せずに子供みたいにピーピー喚くだけだな。ダセェ。
0476NAME IS NULL2015/06/02(火) 17:26:07.26ID:???
>>474
そうか。俺も馬鹿みたいに煽ってる来る”だけ”の奴がいるから混乱してるんだよ。
変な言い方してたらすまん。

ただ、何度も書くが、俺自身がどう思おうが、どんな知識があろうが、
>>429に対して>>431の質問して、いろいろこうじゃないの?ああじゃないの?
って意見を出すことに四の五の言われる意味が分からん。

473みたいなアホまるだしの奴にも相手してるから、それは俺の落ち度だが。
0477NAME IS NULL2015/06/02(火) 17:29:38.99ID:???
「テーブルを分けることもある」ということだけで、こんなにも荒れるなんて。
最初から、そういうこともあるでFAなのに。
04784672015/06/02(火) 17:30:40.82ID:???
>>469
で、お前は俺に突っ込みを入れてるわけだが
>>459や>>463にはなんで突っ込まないの?
言い方としてはよっぽどそっちの方が悪いと思うけど
まさかそれらもが俺の発言だと思ってるの?
0479NAME IS NULL2015/06/02(火) 17:34:52.71ID:???
もういいじゃん
0480NAME IS NULL2015/06/02(火) 17:36:04.06ID:???
>>478
>>459には>>461で反論してるよ。
>>463には>>465に書いた。
0481NAME IS NULL2015/06/02(火) 17:36:32.47ID:???
こいつか?

>>93
> 何がしたくてこうなってるのか分かんねーから、疑問に思ったこと全部聞いていくしかない
マジ迷惑
0482NAME IS NULL2015/06/02(火) 17:38:04.49ID:???
>>481
残念ながら違うな。
でもさ、お前「迷惑」って言うけど、じゃこのスレで何を語るの?設計じゃねーの?
面倒臭いなら無視すればいい。疑問に思ったことを聞くなって横暴すぎるだろ。
0483NAME IS NULL2015/06/02(火) 17:40:04.75ID:???
俺は良くわかってないけど、わかってそうな奴にかみつけば懇切丁寧に教えてくれる、
いや、俺に教えるべきとか思ってるなら、それは大間違い
0484NAME IS NULL2015/06/02(火) 17:40:51.20ID:???
まじめに議論するスレじゃなくて語るスレだからな
つい他人を下にして語りたくなるんだろ
なんだお前そんなことも言わないとわからないのかよ という俺カッケー的なあれ
04854342015/06/02(火) 17:43:14.22ID:???
もうなんか読む気もなくなる雑然としたチャット状態になっているんだが

>>469
> まず2つ言いたい事がある。
俺からも一つ言わせてくれ。名前付けて。
0486NAME IS NULL2015/06/02(火) 17:44:16.57ID:???
>>483
何度も何度も書いてるが、俺はまず最初に「ツッコミ」をしたんだよ。
「429さん、あなたの設計だと431みたいな場合どうしますか?」って。
それに対して429が自分の考えを書けばいいだけだろ。
事の発端は429で、俺の質問に429が答えたのではない。

>>484
2ちゃんで反論するなって初めて言われたわw
反論したら駄目なローカルルールなんて知らねーよ。
(もし、このスレにあるならもう黙るわ
0487NAME IS NULL2015/06/02(火) 17:45:04.10ID:???
まともに議論したいなら、こんなこと言うのやめましょう。

> だから、それを最初に書けって話なの。
> 後から突っ込まれたから後出して「俺はこういうつもりだった」ってのは卑怯だろ。
0488NAME IS NULL2015/06/02(火) 17:52:12.30ID:???
ここもID表示するようには出来ないのか?
0489NAME IS NULL2015/06/02(火) 18:22:35.71ID:???
>>486
反論するなとか言ううんじゃなくて、なんて言うか

素人が偉そうに語ってるんじゃねぇ という俺カッケー的なあれ
0490NAME IS NULL2015/06/02(火) 18:40:32.53ID:???
もういいから
04914152015/06/02(火) 20:14:35.32ID:???
>>427
> >>415がそうじゃないって言ったら俺にはどうしようもないけど。

合ってるよー w

>>449
関連テーブルの必要性がわからん
0492NAME IS NULL2015/06/02(火) 20:19:32.91ID:???
>>491
どうして無料会員と有料会員2つあるの?

・ログインに関するテーブル
・会員属性に関するテーブル
・有料、サービスに関するテーブル

の3つを基準にすると良いと思うんだけど
04934152015/06/02(火) 20:41:19.20ID:???
>>492
会員属性が有料と無料で違うから
微妙な差ならテーブル一つにして要らない所に Null でも入れとくって言うのもあり
0494NAME IS NULL2015/06/02(火) 21:31:49.85ID:???
>>493
なるほど。そういう考えもあるんだね。
0495NAME IS NULL2015/06/02(火) 22:58:52.53ID:???
すごい勢いだと思ったらまたこの流れかよ。。。
DB試験の過去問チェックしたことあるならパターンがいくつかあるってことわかるだろうに。
0496NAME IS NULL2015/06/02(火) 23:13:34.26ID:???
どこからDB試験が出てきたんだw
0497NAME IS NULL2015/06/02(火) 23:14:21.26ID:???
日中ずっとアホ議論て情報系じゃないパソコン大先生の学生さんなのかね
0498NAME IS NULL2015/06/03(水) 00:01:39.85ID:???
>>434さんのおよそ3パターンに分かれるっていうの、勉強になるなー
自分は別テーブルにするのが当たり前だと思ってたし、
教本でもエンジニアブログなんかでも別テーブルにするやり方しか書いてない。
共通項括りだして属性だけ別にする、なぜなら〜っての気付かなかった。
DB試験に出るぐらい有名なことなんですね。勉強になります
0499NAME IS NULL2015/06/03(水) 10:15:01.21ID:???
>>434
うーむ、この程度は常識だと思ってたが、以外とそうでもないのかな
0500NAME IS NULL2015/06/03(水) 11:48:14.97ID:???
確かにググっても出てこないな。Q&Aサイトも引っかからない。
0501NAME IS NULL2015/06/03(水) 13:47:51.44ID:???
本買って読めアホ
0502NAME IS NULL2015/06/03(水) 14:11:33.94ID:???
>>501
>>498
0503NAME IS NULL2015/06/03(水) 14:16:41.55ID:???
>>498
> 教本でもエンジニアブログなんかでも別テーブルにするやり方しか書いてない。

>>501も言ってるけど、いろいろ本読んだ方がいいよ。
例えば、今回の話題(共通項が多いが、異なる属性がある場合)なら、直近の書籍だと
『SQLアンチパターン』に説明がある。

Webにも解説あり。

『SQLアンチパターン読書会 「EAV(エンティティ・アトリビュート・バリュー)」に参加しました』
http://makopi23.blog.fc2.com/blog-entry-90.html

『5章 EAV (エンティティ・アトリビュート・バリュー)』
http://qiita.com/deme0607/items/a89319014bc007f09f5c

ありがちな話なので、「SQLアンチパターン」以外にも、この手の話に言及してるものがあると思う。
0504NAME IS NULL2015/06/03(水) 14:20:17.99ID:???
あとは、上のURLからリンクされてる、PofEAAが有名。

『Catalog of Patterns of Enterprise Application Architecture』
http://martinfowler.com/eaaCatalog/index.html

まあ、このサイトはデータベースに特化したものじゃないけど。

データベースに特化したPatternを集めたサイトがあった気がするが、忘れた・・・。
0505NAME IS NULL2015/06/03(水) 14:37:02.14ID:???
ブログとか拾い読みするより、本買って読んだ方が断然効率いい
0506NAME IS NULL2015/06/03(水) 15:33:56.08ID:???
>>503-504
横だけど凄い丁寧で誠実な人だな。感心するわ。
あなたみたいな回答者がいれば、スレが荒れることもないのにね。
0507NAME IS NULL2015/06/03(水) 18:21:44.76ID:???
>>506
いつでも無料で情報くれると思うなよ
0508NAME IS NULL2015/06/03(水) 20:03:54.99ID:???
>>507
褒められてる人見て嫉妬しない
0509NAME IS NULL2015/06/03(水) 20:32:06.40ID:???
「スーパータイプ サブタイプ」で検索すれば解説がいろいろ見つかるんだが、
勉強してないとそのキーワードが出てこないよな。
0510NAME IS NULL2015/06/03(水) 21:05:05.44ID:???
初心者脱出するにはこの辺が壁だな。
0511NAME IS NULL2015/06/04(木) 11:51:16.32ID:???
>>510
本読めば一気に脱出できるがな
本読めアホども
0512NAME IS NULL2015/06/04(木) 11:56:20.60ID:???
言葉悪すぎw
そんなんじゃ誰もお前の話なんて聞かねーよ
0513NAME IS NULL2015/06/04(木) 12:48:40.71ID:???
いちいち文句付けないと自我でも崩壊するのか?
0514NAME IS NULL2015/06/04(木) 13:12:01.08ID:???
崩壊するんだろうな。とにかく嫌味を言わないと気がすまないんだろう
0515NAME IS NULL2015/06/05(金) 00:08:40.38ID:???
アナル
0516NAME IS NULL2015/06/05(金) 20:54:48.24ID:SMCH9gEQ
テーブルhoge (カラムはa,b)
テーブルpiyo (カラムはa,c)
とあって、
hoge がまず存在して、piyo はhogeがあるときだけ存在する
(hoge.a と piyo.a は同じ)

でもたまに piyoだけ存在することもある
(そのときpiyo.a はnullになってる)

という関係をデータベース用語でなんと呼ぶの?
0517NAME IS NULL2015/06/05(金) 21:56:39.52ID:???
何故かいるテーブル
0518NAME IS NULL2015/06/05(金) 23:17:08.11ID:???
普通は先に関係があってそれをもとにテーブルを設計するわけで、キーも定まらない
よくわからないテーブルだけ出されても答えようがない。
関係を考えるならhoge/piyoは一旦忘れて、aとbとcで考えろ。
aとcが無関係なことだけはわかるが、あとはこれだけじゃわからん。
0519NAME IS NULL2015/06/08(月) 13:25:30.20ID:???
>>516
> という関係をデータベース用語でなんと呼ぶの?

呼び名は無い
0520NAME IS NULL2015/06/08(月) 18:16:36.91ID:???
「hoge がまず存在して、piyo はhogeがあるときだけ存在する、でもたまに piyoだけ存在することもある」
という関係
0521NAME IS NULL2015/06/08(月) 18:31:32.07ID:???
矛盾した関係
0522NAME IS NULL2015/06/08(月) 19:35:27.61ID:???
>>517
>>521
これでいいじゃん
0523NAME IS NULL2015/06/12(金) 01:13:07.20ID:???
適当にテーブル定義したらその定義に合わせて自動で1000行適当なデータを入れてくれるようなツールってないですか?
0524NAME IS NULL2015/06/12(金) 04:55:27.11ID:???
ファントムテーブル
0525NAME IS NULL2015/06/12(金) 08:53:29.76ID:KUxeCqtq
正規化しすぎた結果、join後のレコード件数が億件オーダーになってレスポンス悪いでござる。

where句で絞ってからjoinしてくれてるのかな?ちなみにOracle
0526NAME IS NULL2015/06/12(金) 19:47:06.13ID:???
>>525
実行計画やオートトレース確認してみたらいいんでね?
0527NAME IS NULL2015/06/13(土) 06:12:24.57ID:???
>>525
1対多を1対1的にしたいならexists
0528NAME IS NULL2015/06/16(火) 21:11:52.40ID:taWzsqn+
100個のデータの相関関係を管理する
テーブルを作成しようと
id,code1,code2,soukankeisu
のようなテーブル定義を考えています。
これだと相関関係を更新する際に何度もselectしなければならず、時間がかかりすぎるのでは?と考えています。
何か方法はありませんか?
0529NAME IS NULL2015/06/17(水) 10:08:37.06ID:???
>>528
その相関関係を、アプリ側でどのように使用するかによる。
0530NAME IS NULL2015/06/17(水) 10:43:01.52ID:UrK3owRT
>>529
今は
select * from table
where code1=c1 or code2=c2
order by soukankeisuu desc
limit 20
;
を発行し、プログラム側でこれらのレコードからc1でないものを選んでいます。
0531NAME IS NULL2015/06/17(水) 10:46:48.53ID:UrK3owRT
>>528
すみません。
select * from table
where code1=c1 or code2=c1
order by soukankeisuu desc
limit 20
;
でした
0532NAME IS NULL2015/06/17(水) 10:47:40.93ID:???
>>530
ごめん、言葉が足りなかった。
* その相関関係を利用するのは、一つのプロセスなのか、複数なのか
* その相関関係を利用するのは、一つのサーバ上のプロセスなのか、複数なのか

あとは、
* OSは何を想定しているのか

くらいかな。

まぁ、何が言いたいかと言うと、RDBじゃなくて、mmapとかNoSQLのがいいんじゃなかろうかということ。
0533NAME IS NULL2015/06/17(水) 11:01:40.63ID:???
>>531
ちょっと質問
たとえば、code1=2,code2=3 と code1=3,code2=2 では
soukankeisuu は異なるのかな、同じになるのかな?
0534NAME IS NULL2015/06/17(水) 11:17:06.31ID:UrK3owRT
Webアプリ(1つのサーバーでcentos+apache+php+mysql)を想定していますが、
相関関係を求める処理はwindowsで行っています。
windowsでの作業はバッチ処理のようなイメージで
相関関係を実際に求め
code1,code2,soukankeisuu
というCSVファイルにまとめて(サイズは73Mぐらい)、
更新用SQLファイルを作成し、サーバーにアップする。
0535NAME IS NULL2015/06/17(水) 11:19:28.24ID:UrK3owRT
>>533
同じになります。
idに主キーを設定しており、
二つのコードは C0001、C0002だとしたら、これらをソートし
C0001-C0002という値をidに設定しています。
0536NAME IS NULL2015/06/17(水) 11:19:44.99ID:???
何でサーバー側でやらないのか、ちょっと不思議
0537NAME IS NULL2015/06/17(水) 11:24:18.03ID:UrK3owRT
>>532
情報が後だしになって申し訳ありません。
今は430万レコードぐらいです。
0538NAME IS NULL2015/06/17(水) 11:28:52.64ID:???
>>537
今までの話聞いてて推測するんだけど、
その数はIDが2000件くらいあって、そのかけ算の結果430万ってことかな?
0539NAME IS NULL2015/06/17(水) 11:31:53.13ID:UrK3owRT
>>536
すみません。
まだLinuxでの操作経験、知識欠けていること
相関関係を求めるための元データ(xmlとexcel)が不安定?というか信頼性にかけるところがあり
それをチェックするにはwindows環境のほうが作業がしやすいこと
からサーバーで実行するのは不安なんです。
0540NAME IS NULL2015/06/17(水) 11:38:00.70ID:UrK3owRT
>>538
code1(やcode2)は5000ほどあり、
5000*5000の行列の上三角の対角なしで、
相関係数の絶対値が一定の値以上のものを選定しています。
0541NAME IS NULL2015/06/17(水) 11:44:06.77ID:???
> これだと相関関係を更新する際に何度もselectしなければならず、時間がかかりすぎるのでは?と考えています。
> 何か方法はありませんか?

まず、相関関係を更新するのに、truncate tableしてから全レコードimportでいいなら、そうすれば
処理時間は大幅に短縮できる。

相関関係を更新するのが差分適用の場合、mysqlならINSERT ... ON DUPLIATE KEY UPDATEが
使える。

相関関係の更新が大量かつ頻繁に行われるということであれば、使ったことはないが、
InnoDB memcached pluginも考慮に値すると思う。
http://thinkit.co.jp/story/2014/01/08/4716

さらに、相関関係テーブルを他のテーブルとJOINする必要がないのなら、MySQLではなくて、
NoSQLオンリーの運用も考えられる。
0542NAME IS NULL2015/06/17(水) 11:53:27.94ID:UrK3owRT
>>541
さまざまな案を考えていただきありがとうございます。

INSERT ... ON DUPLIATE KEY UPDATE
InnoDB memcached plugin
NoSQLオンリーの運用

を調べてみてみます。
0543NAME IS NULL2015/07/09(木) 17:48:26.06ID:T1cEsjFS
くだ質ですが当分投稿も無いので質問します。
皆さんは住所関連のカラム名ってどうしてますか?

郵便番号はzip?postcode?
後者が正しいようですが、郵政のサイトではzipになっています。

都道府県はpref?prefecture?

市区町村〜番地、マンション・建物名は
address1、address2、address3 などの簡易表示?
city、town、street などの英名?

カラム名を迷って設計できないことが多々あるので、
皆さんはどうしているか教えて下さい
0544NAME IS NULL2015/07/09(木) 17:59:43.77ID:???
>>543
こういうとこ参考にしてみるのもいいよ。
http://www.databaseanswers.org/data_models/index.htm

ちなみに、http://www.databaseanswers.org/data_models/customers_and_addresses/index.htm 見たら、
郵便番号はzip_or_postcodeってなってて、zipがアメリカ英語、postcodeがイギリス英語らしいね。
0545NAME IS NULL2015/07/13(月) 07:00:56.07ID:JM7F60EO
>>543
日本語でやれば解決
悩まなくてすむ
住所以外でも諸々
0546NAME IS NULL2015/07/13(月) 10:27:28.33ID:???
>>545
> 日本語でやれば解決
俺もつい最近までそう思ってました。MSSQLだしWindowsだしって理由で。
だが、Sync Frameworkが使えない場合があるというのでドはまりした。
今でもこんなこと良くあることなんですかね。
0547NAME IS NULL2015/07/13(月) 23:15:33.74ID:???
>>544
返事遅くなってすみません。
このサイトっていわゆるER図のサンプルサイトですかね。

ただ、例のは「line_1、line_2」とか曖昧な名付けであんまり参考にはなりませんが・・・
0548NAME IS NULL2015/07/13(月) 23:19:43.96ID:???
日本語とかローマ字ってのも、後から見た人から馬鹿にされそうだし、
やっぱり英語の方が良いと思うんですよね。確かに分かりやすいとは思いますが。

ただ、有名ところのフォームのソースなんかみても、
みんな適当なんですよね。記号的に名前つけてる感じで。
そんなんで後から困らないか?って思うんですけど、気にしてないんですかね。
0549NAME IS NULL2015/07/14(火) 03:48:22.33ID:???
>>547
なぜline_1 line_2に至ったのかを考える脳がないならすべて役に立たないから見ないほうがいい
0550NAME IS NULL2015/07/15(水) 10:24:55.73ID:???
>>549
うーん、それを超えてるんですよ。
「なぜそこに至った経緯は分かるけど、それは果たして使えるのか?」って。

そもそも質問している事と違うことに対してレスされることに対して
「すべて役に立たない」って断定して批判するのはいかがなもんでしょう?
0551NAME IS NULL2015/07/15(水) 10:29:29.77ID:???
例えばですよ、「卵と玉子、どっちの表現にすればいいですかね?」
って質問してるのに、「カタカナでタマゴにするべき」って言うのと一緒だと思うんです。

カタカナにした意図は分かるものの、こっちの質問とは違うじゃないですか。
「卵と玉子の本来の意味や使用用途、使用範囲を考えたらこうするべき」
って意見がほしいのに、全く違う意見を出されて
「タマゴにする意図がわからないなら質問するな(他人に聞くな)」
ってのは、ちょっと横暴すぎると思うんですよ。言い方をもっと変えないと。
0552NAME IS NULL2015/07/15(水) 10:47:43.98ID:???
凄いよなぁ
質問する→回答される→それは超えてるんですよ
命名レベルで足止まるドシロウトに越えられるって笑う
使えるか使えないか判断する立場はまだまだ早い感じ
0553NAME IS NULL2015/07/15(水) 11:37:23.74ID:???
永遠にそれだけ考え続けとけよ w
0554NAME IS NULL2015/07/15(水) 12:19:27.92ID:???
>>552
お前以下の奴はそうそう居ないと思うぞw
0555NAME IS NULL2015/07/15(水) 13:38:50.68ID:???
正式名称なのにそれを超えちゃったらどうしようもないでしょ
0556NAME IS NULL2015/07/15(水) 13:55:16.85ID:???
>>547
> このサイトっていわゆるER図のサンプルサイトですかね。
ER図のサンプルじゃなくて、Data Modelのサンプル(または実例)。

> ただ、例のは「line_1、line_2」とか曖昧な名付けであんまり参考にはなりませんが・・・
そうかな。このページだけでもいろいろと示唆に富んでると思うんだが。

俺は、このモデルにマッチする要件のシステムは作ったことないけど、なるほど、
こんな感じにモデリングする要件もあるのかと感心したが。
0557NAME IS NULL2015/07/15(水) 15:10:30.68ID:???
line_1とか2とか何だと思ってそのサイトみたけど
日本語でよくある住所1住所2かw

住所って、表示/印刷すること考えると、改行個所どうすかって問題が出るんだよ
だからデータ上、行ごとに分けて持つのはよくあるパターンだぞ
0558NAME IS NULL2015/07/15(水) 17:27:21.30ID:???
>>551
> カタカナにした意図は分かるものの、こっちの質問とは違うじゃないですか。
> 「卵と玉子の本来の意味や使用用途、使用範囲を考えたらこうするべき」
> って意見がほしいのに、全く違う意見を出されて
> 「タマゴにする意図がわからないなら質問するな(他人に聞くな)」
> ってのは、ちょっと横暴すぎると思うんですよ。

それは意図が分かっていないからじゃないか?line_1 line_2にしている意図を書いてみ。
意図が分かっているのなら、こうするべきって意見が出てこないことにひとつの着地点を見出せてるはずだが。
それでもこうするべきという意見がほしいというなら、勝手にすればいいじゃんっていうしかない。
0559NAME IS NULL2015/07/17(金) 00:35:32.77ID:???
急な出費でお困りの方キャッシング・カードローンまとめをぜひご活用下さい。
http://komattarasoudan.seesaa.net/article/422452476.html
最近髪でお悩みの方悩まずはこちらをご参考だて下さい。
http://kaminokehahaeru.seesaa.net/article/422482791.html
0560 ◆Ww2pZaKGaW0T 2015/07/18(土) 15:15:09.78ID:???
最初に無があった
無は有を生んだ
これが全ての真理
0561NAME IS NULL2015/07/19(日) 21:25:29.25ID:???
なんにもないなんにもないまったくなんにもない
0562NAME IS NULL2015/07/22(水) 20:53:37.13ID:???
googleさんで検索すると
address line 1 →住所1
address line 2 →住所2行目

って出てきた。でも、住所2行目ってなんの事か分からなくね?
address cityとかaddress townの方がよくね?
0563NAME IS NULL2015/07/22(水) 22:41:43.33ID:???
そもそも住所の段落なんて見た目だけの問題なんだしフィールド1つにして改行コードでも入れとけよ
0564NAME IS NULL2015/07/22(水) 22:54:19.26ID:???
郵便番号検索は使わないのか?
0565NAME IS NULL2015/07/23(木) 00:25:45.19ID:???
>>562
よくないからline1 line2にしてるんだ。
0566NAME IS NULL2015/07/23(木) 00:43:53.28ID:???
>>563
それも手ではあるけど
行数限定が難しかったり
改行コードが何かとかでトラブったりするんだよなぁ
経験上、住所に限れば固定行数として持たすほうが色々楽な事が多いんじゃね
0567NAME IS NULL2015/07/30(木) 21:04:00.60ID:???
>>565
なぜよくないの?
0568NAME IS NULL2015/08/04(火) 20:06:09.37ID:???
one or zero to one or zeroの関係性を作りたいのですが、実現できるのでしょうか?
調べても出てこないので困っています
助けてください
0569NAME IS NULL2015/08/04(火) 20:55:19.15ID:???
連関テーブル作ってそれぞれのキーにユニークインデックス貼ったら?
0570NAME IS NULL2015/08/04(火) 21:02:09.67ID:???
>>569
ありがとうございます
そうすればうまくいきますね
0571NAME IS NULL2015/08/07(金) 19:35:44.75ID:+bbUwYmn
安倍は許した
http://live.fc2.com/79752690/
0572NAME IS NULL2015/08/26(水) 09:44:57.47ID:???
株式銘柄のデータベースを作ろうとしています
主キーは銘柄コード(銘柄ごとに割り当てられている4桁の数字)にしようと思うんですが問題ありますか?
オートインクリメントのidじゃないといけないんでしょうか
0573NAME IS NULL2015/08/26(水) 10:33:47.39ID:???
サロゲートキーを使うのはキーが再利用されるとかキーがないとかメンテナンスしにくいときくらいかと
銘柄コードは再上場の時くらいしか再利用されないからキーにいいんじゃないかなあ
0574NAME IS NULL2015/08/26(水) 11:40:20.04ID:???
>>573
ありがとうございます
銘柄コードをキーにすることにしました
0575NAME IS NULL2015/08/26(水) 16:33:38.47ID:???
>>574

重複上場(東証と名証 etc)などは考慮せずだよな?
俺はそうしてるけど
後、優先株式は5桁なのは知ってるか? 伊藤園 優先は5桁になってるぞ
ついでに言うなら先物や指数はどうすんの?
桁数を固定にする必要はないと思うけど
0576NAME IS NULL2015/08/26(水) 17:35:44.81ID:???
桁数を固定したいという話は出てないかと
0577NAME IS NULL2015/08/26(水) 18:28:06.46ID:???
めんどくせーから、サロゲキーにしとけや
0578NAME IS NULL2015/08/26(水) 20:45:29.91ID:???
>>576
そうでした^^;
0579NAME IS NULL2015/08/26(水) 23:48:42.33ID:???
重複上場については無視するつもりでしたけど
後々何か問題が起こるのも嫌なのでとりあえずサロゲートキーにしてみます
0580NAME IS NULL2015/08/29(土) 00:02:49.38ID:RF4wAyRY
データベース関係について語り合うならBeLongs!がおすすめ。
よかったら、「blngs」で検索してみて!
0581NAME IS NULL2015/08/29(土) 00:09:04.60ID:???
みてみたらひどいサイトだった
0582NAME IS NULL2015/08/29(土) 01:20:53.25ID:???
こいつどこにでも湧いてるぞ
0583NAME IS NULL2015/08/29(土) 09:58:03.48ID:???
>>572
長期利用だと銘柄が被るから
厳密にやるなら適用開始終了日で複合キーになるはずだよ
0584NAME IS NULL2015/08/29(土) 11:18:28.57ID:???
大規模サイトでも利用できるユーザーテーブルの設計を学びたいのですが、
良い参考書をご存じないですかね?
0585NAME IS NULL2015/09/01(火) 18:33:31.19ID:???
なんか削除フラグの話がバズってますな
0586NAME IS NULL2015/09/01(火) 20:56:02.34ID:???
バズるきっかけのスライドが何の結論も持ち出してないのにそのリンクを貼るだけのツイートのなんと多いことか。
0587NAME IS NULL2015/09/01(火) 23:15:04.96ID:???
別に削除フラグあってもいいじゃん
0588NAME IS NULL2015/09/02(水) 02:47:05.19ID:???
つまるところ、思考停止してませんか?っていうトピックなだけだと思う。
その槍玉に挙げやすかったし、共感もよびやすかったのだろう。
0589NAME IS NULL2015/09/02(水) 13:34:38.42ID:???
思うんだが、思考停止してでも「やりきる」事が大事だと思うんだよな。
削除フラグにしようが削除日にしようが削除履歴にしようが
どんなパターンでも「有り」なんだから、まずはやってみて決めればいいんだよ。
やる前に四の五の考えるからやれなくなるわけで。
0590NAME IS NULL2015/09/02(水) 14:42:13.06ID:???
>>589
いや、なぜだか削除フラグだけは無しだってことになってる
0591NAME IS NULL2015/09/02(水) 15:38:06.33ID:???
削除フラグが妥当なケースはそうはない。って言ってるだけだ。
0592NAME IS NULL2015/09/02(水) 15:54:24.28ID:???
>>591
そう?俺の場合結構あるけど。

例えば、
users: {user_id(PK), user_name}
blog_posts: {id(PK), user_id(FK), post_at, contents}
みたいな関係の場合、ユーザが「削除状態」になったらそのユーザに関連するデータは生成されなくなる。
一方、blog_postsの内容を表示するときは、「削除状態」に関わらず単純にusersをjoinすればいい。

で、何かの要件でユーザが「削除状態」であることを区別する必要がでてきたら、最も簡単なのは
users: {user_id(PK), user_name, delete_flag}

日付が必要なら
users: {user_id(PK), user_name, delete_at}
とかでもいいけど。

これ俺的には良くあるケースなんだが。
0593NAME IS NULL2015/09/02(水) 16:13:37.27ID:???
http://www.slideshare.net/t_wada/ronsakucasual
見たけど、>>592の例で言えば「ブログを削除する」のを
blog_posts: {id(PK), user_id(FK), post_at, contents, delete_flag}
にするのがアンチパターンっていってるのか。

そりゃそうだ。
0594NAME IS NULL2015/09/02(水) 17:14:55.28ID:???
>>593
そんなこと書いてないよな。
0595NAME IS NULL2015/09/02(水) 17:41:17.21ID:???
>>594
んーと、「時系列に生み出されるデータ」を「削除状態」にするときに、そのテーブルに削除フラグを
追加するのがアンチパターン。

>>593の例だとBugsテーブルで、>>592だとblog_postsテーブル。
それは良くない。

俺が結構あるっていってるのは、>>592のusersのような立場のテーブルを「削除状態」にするケース。
0596NAME IS NULL2015/09/02(水) 18:02:10.67ID:???
書籍『SQLアンチパターン』の例だと、とあるBTSに以下のようなテーブル(カラムは一部省略)があるとき、

CREATE TABLE Accounts (
  account_id SERIAL PRIMARY KEY,
  account_name VARCHAR(20)
);

CREATE TABLE Bugs (
  bug_id SERIAL PRIMARY KEY,
  date_reported DATE NOT NULL,
  description VARCHAR(1000),
  reported_by BIGINT UNSIGNED NOT NULL,
  assigned_to BIGINT UNSIGNED,
  FOREIGN KEY (reported_by) REFERENCES Accounts(account_id),
  FOREIGN KEY (assigned_to) REFERENCES Accounts(account_id)
);

「アカウント削除」はどう実装すれば良いかって言う問題。

Accounts.delete_flagが増えても、別にバグ一覧表示とかバグ新規登録には影響しない。
AccountsがBTSへのログインに使われる場合と、assignするときに「現行ユーザ」を取得
するために、WHERE Accounts.delete_flag = falseとかが必要になるだけ。

いやいや、「だけ」じゃなくてそれが問題だっていうのかもしれないが、俺は別にアンチパターン
だとは思わないんだよね。
0597NAME IS NULL2015/09/02(水) 18:25:55.50ID:???
>>596
この構造でbugsを削除するのに、削除フラグ使う奴なんているのか?
それとも俺が想像できないだけで、そういう奴が多数いるのか?
0598NAME IS NULL2015/09/02(水) 18:56:11.52ID:???
>>592
俺が言ってるわけじゃない。というのはさておき、

状態が欲しけりゃ以下略。
少なくともスライド主は妥当なケースではないと論じてるね。
0599NAME IS NULL2015/09/02(水) 19:04:33.06ID:???
>>596
BTSの場合はチケットが主で、それにユーザがアサインされる関係で、
ブログの場合は、ユーザが複数の記事を所有してる関係だよね。
なぜ混同するの?
0600NAME IS NULL2015/09/02(水) 22:08:37.73ID:???
>>590
基準がよく分からんなぁ…
bool deletedはNG、int statusはOK
なんて言ってたのもこの人なんでしょ
0601NAME IS NULL2015/09/02(水) 22:11:28.93ID:???
色々システム見てきてるけど int status なんてかなりのケースで謎数字が出てくるもんだと思うけどなぁ
出来る人が使ったらそうでもないんだろうなぁ
0602NAME IS NULL2015/09/03(木) 01:29:20.07ID:???
>>601
それDB設計となんの関係もない話。
0603NAME IS NULL2015/09/03(木) 01:41:20.67ID:???
>>600
削除っていうのが嫌なのかも

実際に削除しないのなら削除言うな。と

あなたが(あるいは顧客が)本当にやりたい事は削除じゃないんでしょ。と
0604NAME IS NULL2015/09/03(木) 03:58:56.69ID:???
>>603
なるほど
設計に入る前にヒアリングをしっかりしとけ、で終わる話か
この話題には削除フラグを立てておこう
0605NAME IS NULL2015/09/03(木) 06:44:23.78ID:???
>>603
無効フラグでいいかと
0606NAME IS NULL2015/09/03(木) 11:15:49.31ID:???
>>599
> BTSの場合はチケットが主で、それにユーザがアサインされる関係で、
> ブログの場合は、ユーザが複数の記事を所有してる関係だよね。
> なぜ混同するの?

BTSの場合:
現在有効なユーザがログインする(Accounts参照) → そのユーザがチケットを作成
そのユーザを「削除状態」にする
そのユーザはログインしない(できない)ので、そのユーザは以降チケットを作成しない

ブログの場合:
現在有効なユーザがログインする → そのユーザがブログを作成
そのユーザを「削除状態」にする
そのユーザはログインしない(できない)ので、そのユーザは以降ブログを作成しない

同じだよね?

BTSの場合はブログと違って「アサインする」というアクションの時に「現在有効なユーザ」を
検索する必要があるというだけ。
0607NAME IS NULL2015/09/03(木) 11:19:16.18ID:???
なので、>>593のスライドでBugsテーブルに削除フラグを追加するのがどうかという話は、
>>592のblog_postsに削除フラグを追加するのと同じってことで、それは俺も筋が悪いと思う。

俺が「結構ある」っていってるのは、users(SQLアンチパターンで言えばAccounts)を
「削除状態」にするとき、delete_flagで十分な場合が結構あるってこと。
0608NAME IS NULL2015/09/03(木) 11:38:12.57ID:???
>>603
> 削除っていうのが嫌なのかも

この話題に関して、「削除フラグは思考停止である」って思考停止してる人結構居るよ。
0609NAME IS NULL2015/09/03(木) 11:40:45.88ID:???
論理削除とかいうと発火する奴多数
0610NAME IS NULL2015/09/03(木) 12:41:49.63ID:???
>>606
ユーザが削除されたときにチケットなりブログなりを表示すべきかって話かと思ってたわ
0611NAME IS NULL2015/09/03(木) 13:08:16.85ID:???
>>610
表示する必要ないなら、物理削除でええやん
0612NAME IS NULL2015/09/03(木) 14:06:34.72ID:???
社員が退職したから社員マスターから物理削除(あるいはアーカイブテーブル行き)とか、
商品の取り扱いが終了したから商品マスターから物理削除とかしてたら、
それに紐付くデータの取り扱いがすごく面倒な気がするんだが。

物理削除するために、いわゆるトランザクションデータには、いわゆるマスターデータの
項目(社員名とか商品名とか)を全てコピーするという設計も見たことあるが、
それもどうなのと思う。
0613NAME IS NULL2015/09/03(木) 14:16:51.25ID:???
名称コピーは削除の為というか、名称の派生や変更が多い時、当時データの保存で使うのだと思う
0614NAME IS NULL2015/09/03(木) 16:01:57.15ID:???
変更が多くなくとも、一回でもありえたら(更新機能があったら)、そう設計する場合もある。
俺だったら、有効期間をもたせるが。
0615NAME IS NULL2015/09/03(木) 16:03:31.90ID:???
ただし、有効期間をdate型にすると、一日二回更新されると死ぬ。
かといってdatetimeも嫌だし。

とすると、データコピーもありなのか・・・。うーむ。
0616NAME IS NULL2015/09/03(木) 16:54:18.15ID:???
>>611
そうだな。ユーザも物理削除でいいよな。
0617NAME IS NULL2015/09/03(木) 17:37:45.97ID:???
削除して後始末はどうすんの、海に沈めるか
0618NAME IS NULL2015/09/04(金) 13:39:30.97ID:???
削除フラグ=会員を辞める的な解釈として、
「退会理由(削除理由)」が必要な場合はどうしてる?

>>596の例ならAccountsテーブルにカラム追加するパターンだと思うけど、
これも削除フラグの一種だと思ったり。
(退会理由が入力されていたら、その会員は退会済みとか。
0619NAME IS NULL2015/09/04(金) 13:53:44.95ID:???
Accountsのほとんどの人に退会理由を入れる必要がないのに
同じテーブルに追加するのは愚の骨頂
0620NAME IS NULL2015/09/04(金) 17:05:32.06ID:???
>>618
> >>596の例ならAccountsテーブルにカラム追加するパターンだと思うけど、
NULL撲滅委員会は駄目だって言うだろうね
0621NAME IS NULL2015/09/04(金) 18:43:38.61ID:???
>>619-620
じゃ、別テーブルを用意するのか?それも無駄にならね?
0622NAME IS NULL2015/09/04(金) 18:47:58.36ID:???
あともう1つ思いついた。会員の登録確認(アクチベーション的な処理)だとどうだ?
Webでよくある、「会員登録したら確認メールが届いて、URLクリックすると本登録」

これもAccountsテーブルにカラム追加して、確認時に識別コードを照会して
本人か否か確認するってパターンがあるけど、これも別テーブルにするのか?
それともこれは「必ず最初に必要」な処理だから、NULL扱いにはならないか?
0623NAME IS NULL2015/09/04(金) 18:55:05.97ID:???
クリックするだけの奴がいたら、パンクしそう
0624NAME IS NULL2015/09/04(金) 19:22:45.87ID:???
>>622
それ、ユーザの状態が仮登録から登録になったらそれ以降ずっと使わないカラムだろうなぁ
0625NAME IS NULL2015/09/04(金) 19:32:08.31ID:???
>>624
例えば本登録の場合、「パスワード再発行」とかの認証用コードに流用出来ないかな?
そうすれば使わないって事もないと思うんだが。
0626NAME IS NULL2015/09/04(金) 19:42:33.26ID:???
>>625
何でひとつのカラムに複数の意味を持たせてしまうんだろうなぁ
0627NAME IS NULL2015/09/04(金) 19:42:36.06ID:???
そういう使い回しはバグの原因になりそう
0628NAME IS NULL2015/09/04(金) 20:05:19.12ID:???
>>626-627
でもさ、そうすると俺(618以降)が出した要件分のテーブルが必要になるよ?

・Accounts(アカウント管理)*これは>>596
・Reason(退会理由)
・Activation(アカウントのアクチベーション)
・Reminder(アカウントのパスワードの再発行)

これに主題となっている、
「削除フラグやめて履歴テーブル追加」をするとまたテーブルが増える。
それが正しい(アンチパターンじゃない)って事かもしれないけど、
随分、利便性が悪くなるなって感じるんだけど。
0629NAME IS NULL2015/09/04(金) 20:28:58.78ID:???
>>628
非正規化は正規化を済ませたあとにやむを得ず行うことだって勉強しなかったの?
ちなみにそれらについて利便性が悪いと感じる部分は見当たらないけれど。
0630NAME IS NULL2015/09/04(金) 20:30:19.41ID:???
ああ、あと、
> 「削除フラグやめて履歴テーブル追加」をする
のであれば、退会理由はそのテーブルに持たせられるよね。
0631NAME IS NULL2015/09/04(金) 20:34:20.93ID:???
>>629
俺自体は>628な感じで設計してるけど、「これで良いのかな?」とずっと悩んではいる。
要件追加される毎にテーブルも追加ってのがどうもね

>>630
退会理由って必ず入力されるものでもないから、
>>620がいうNULL撲滅委員会は駄目だっていうんじゃないかな。
0632NAME IS NULL2015/09/04(金) 20:45:34.00ID:???
>>631
「テーブルを追加すべき要件」が追加されるごとにテーブルが追加されるだけだと思う。
退会理由として「なし」をユーザが「選択」したのなら、それはNULL以外の値を割り当てるべきじゃないでしょか。

俺も別にNULL撲滅委員会を信奉しているわけではないので、
退会理由「その他」+退会理由フリーテキストのカラムを用意するなら、それがNULLであることは問題視しない
0633NAME IS NULL2015/09/04(金) 20:49:30.34ID:???
>>632
なるほど。「選択したかしないか」を理由にしているわけですね。
NULLが入るのではなく、空白が入ると。

では、顧客情報テーブルとかプロフィールテーブルとかの
「必須項目じゃないカラム」も、”選択してない”として、
同じテーブル内にあっても問題ないわけですかね?
0634NAME IS NULL2015/09/04(金) 20:50:29.75ID:???
退会しちゃう(しちゃった)人の履歴をどこまで残すかって事でしょ。
普通なら、退会と同時(多少時間的な猶予は取るかもしれないけど)に
個人情報の抹消はしないといけなくなる。
だから、退会理由のような、運営上必要なデータを取るとしても、
個人に紐付ける必要は無いんじゃない?統計として取れば十分だと思うよ。
0635NAME IS NULL2015/09/04(金) 20:54:27.30ID:???
>>633
なぜ「なし」の値が空白になると思ったんだろ。
webシステムでドロップダウンを作る際、「なし」のvalueに空白を設定するの?

後段については、俺はNULLで入れていいと思うよ。
プロフィールという一まとまりの情報の一部において、何も選択しなかった場合だよね。
0636NAME IS NULL2015/09/04(金) 20:55:55.24ID:???
必須じゃないカラムが入ることを許しつつ、認証コードは許さない理由が分からないという話に発展しそうだが、
ユーザ情報と認証情報が別だからだよと一応。
0637NAME IS NULL2015/09/04(金) 21:01:18.18ID:???
目的はユーザーから見たみかけ削除ですと自ら書きつつ
お客は本当に削除を求めているのか?と自らに問うている

禅問答スライドショーの真意はここにあるのではなかろうか
0638NAME IS NULL2015/09/04(金) 21:01:18.85ID:???
>>635
いやいや、「なしを選択したら」って条件を出されたら、空白だって思うでしょw
NULL以外の値を割り当てるべきだって追記してるんだから。
NULLと同等としたら、空白だって思うのが自然では?
0639NAME IS NULL2015/09/04(金) 21:02:51.72ID:???
>>636
そこに発展させようと思ったのですが、

>ユーザ情報と認証情報が別だからだよと一応。

なぜユーザー情報と認証情報が別なら「良いこと」にされるかわからないんですよね。
一貫性がないじゃないですか。それだと。
0640NAME IS NULL2015/09/04(金) 21:02:56.69ID:???
>>638
NULLと同等じゃないから別の値を割り当てるって言ったんだよ。
そうしないとオラクル信者が殴りこんでくる
0641NAME IS NULL2015/09/04(金) 21:03:45.61ID:???
>>639
「良いこと」ってなんだろ。別テーブルにするんだよ。
0642NAME IS NULL2015/09/04(金) 21:06:06.19ID:???
>>641
あれ?そういう意味(別テーブルにする)なんですか?

それなら、>>633にも書きましたけど、
「必須項目じゃないカラム」は全部別テーブルにするのですか?
0643NAME IS NULL2015/09/04(金) 21:07:51.58ID:???
>>642
プロフィールという一まとまりの情報の一部において、必須ではない情報があるときは同一テーブル
ユーザ情報と認証情報(アクティベーションのやつね)は別情報だから別テーブル
と書いてるつもりだけど、そこは伝わってますかね。
0644NAME IS NULL2015/09/04(金) 21:09:53.45ID:???
>>643
つまり、設計ではなくて「用途」によって、考え方(アンチパターンか否か)を変えても良い

って解釈をしてもいいですか?
0645NAME IS NULL2015/09/04(金) 21:10:43.85ID:???
>>644
そこで出てきているアンチパターンって何?NULL撲滅?
0646NAME IS NULL2015/09/04(金) 21:11:14.48ID:???
>>645
NULL撲滅とか、削除フラグをどうするか、とか今のテーマとなっていることですね
0647NAME IS NULL2015/09/04(金) 21:18:17.67ID:???
>>646
NULL撲滅については上で書いたとおり信奉してない。

あと、削除フラグについての話はしてないよね。
強いて書くなら、アクティベーションが必要な場合、ユーザの状態管理は削除フラグでは完結できないよね。
↑この場面を想定してあのスライド(の元になった記事)は書かれていると記憶している。
で、ユーザの状態をどう管理するかとして提示されているのが、
状態フラグを持たせるかテーブル分割をするか。

めんどくさくなってきた。
0648NAME IS NULL2015/09/04(金) 21:21:33.19ID:???
>>647
確かに面倒臭いですねw

アンチパターンを気にしすぎてテーブル数が増え、設計がややこしくなるなら、
アンチパターンでも分かりやすい設計の方が良いんじゃないか?って思うんですよね。
自分は正規化やらアンチパターンやら気にしすぎて、何も作れなくなってるんで。
0649NAME IS NULL2015/09/04(金) 21:26:00.22ID:???
極端な話、Columnはtextで一つ確保して、
特定のセパレータで複数の情報を書いたらいいのか?
どうせ、必須項目の値は入るから、全レコードNullじゃなくなる。
無駄はないような気がする。
0650NAME IS NULL2015/09/04(金) 21:27:39.91ID:???
>>648
テーブル数が増えたから設計がややこしくなるなんてことはないと思うけど。
JOINが増えて面倒ってなら分からなくもないけど、必要ならビュー作ればいいわけで。

どういうときに分かりやすい設計とかややこしい設計って思っているのか、一度考え直してみたらどう。

>>649
JSON型万能説の話か
0651NAME IS NULL2015/09/04(金) 21:30:08.15ID:???
>>650
ビューも良いんですが、単純にSQLのコードが長く異なる事態が、
ミスやバグに繋がると思うんですよね。
やっぱりJOINは出来るだけ少なくしたほうが、それらのリスクは減るじゃないですか。

テーブルに関しても、多いより少ないほうが把握しやすいのでは?
脳内でER図を描くにしても、少ない方がテーブル名だけ見て把握できるし。
0652NAME IS NULL2015/09/04(金) 21:31:51.72ID:???
>>651
俺は正規化は決してしないっていうのなら無理には止めないけど、するんでしょ。
どこまでやって、どこからやらないのかは線引きできる?
0653NAME IS NULL2015/09/04(金) 21:34:59.57ID:???
>>652
第三正規化までは積極的にやるべきだと思いますが、
それ以降はしなくて良いと思う時は有りますね。
あと、「削除フラグ」や「退会理由」なんかも別に1つのテーブルで良いとは思います。
0654NAME IS NULL2015/09/04(金) 21:38:38.18ID:???
未認証のユーザ、認証済みのユーザ、退会済みのユーザが1テーブルに存在するってことだろうけれど、
case 削除フラグ when true then 削除 else
case when 認証コード is null then 認証済み else 未認証 end
end as 状態
ってすんの?
0655NAME IS NULL2015/09/04(金) 21:42:09.53ID:???
>>654
そのやり方とは違うけど、自分ならこうするかな

#認証済みのレコード取得
SELECT * FROM アカウントテーブル WHRE 状態=認証済み

#退会済みのレコード取得
SELECT * FROM アカウントテーブル WHRE 状態=退会済み
0656NAME IS NULL2015/09/04(金) 21:42:37.86ID:???
>>655
状態に削除を含めずに削除フラグを持たせるのはなぜ?
0657NAME IS NULL2015/09/04(金) 21:46:25.48ID:???
>>651
実際に正規化て何?レベルのDB見たらそんなの言えなくなる
作るタイミングでわかるバグやミスなんかより正規化してないDBの運用のが数十倍リスク高い
0658NAME IS NULL2015/09/04(金) 21:49:28.84ID:???
>>657
正規化なんて何?レベルなら確かにそうですけど、
私があなたと話しているレベル(退会理由や認証のカラムを1つにまとめるか分けるか)
程度なら、そう問題ないんじゃないですかね?

ちょっと例が極端すぎると思うんです。どこかで落とし所をつけないと
0659NAME IS NULL2015/09/04(金) 21:51:08.83ID:???
>>656
削除と退会は違うからじゃないかな
退会しても削除したい/したくないってケースはあるだろうし。
0660NAME IS NULL2015/09/04(金) 21:58:55.49ID:???
>>658
長らくほぼマンツーで話してた俺と>>657は違うよ。
>>657の話も分かるけど、>>658は第三正規形までは持っていくとのことなのでスジが違うね。

>>659
じゃあ、その「削除」ってつまるところ何?ってところが削除フラグの話の根底にあるんじゃないかな。
たとえば非表示にしたいだけなのか、運用上はもういない扱いにしたいのか。
前者ならふさわしいフラグなり状態なりがあるだろうし、後者なら履歴テーブルに移動してしまえばいいのでは、と。
0661NAME IS NULL2015/09/04(金) 22:01:10.70ID:???
元々のスライドがめちゃくちゃなのに
よく続くなこの話
0662NAME IS NULL2015/09/04(金) 22:23:03.08ID:???
良いんじゃないの。停滞していたスレに新たな話題となってるんだから。
0663NAME IS NULL2015/09/04(金) 22:26:37.63ID:???
ひょんな事からデータ流出が起こり、退会しているはずのユーザー情報が漏れた時は、
ユーザーに何て言い訳したら良いんだろうか?
そういう話題はこのスレのテーマとは違うのかな?
0664NAME IS NULL2015/09/04(金) 22:31:23.60ID:???
法務、広報、営業の仕事だな
0665NAME IS NULL2015/09/04(金) 22:47:34.19ID:???
>>663
退会した顧客のデータは速やかに削除します、みたいな規約にしているところが多いから、
住所や電話番号みたいな個人データを残しておくのは問題。
そういう点でも、退会履歴テーブルを用意してユーザID、退会日、備考くらいの
最低限の情報を書き込む運用がいいんじゃないかなーと。
0666NAME IS NULL2015/09/04(金) 22:59:41.04ID:???
>>665
ユーザーIDを残す意味は何なの?残すなら名前じゃないの?
リレーションしているテーブルも削除するんだろうし。
0667NAME IS NULL2015/09/04(金) 23:01:49.80ID:???
>>662
> 新たな話題

ループしまくりですけど...
0668NAME IS NULL2015/09/04(金) 23:04:12.04ID:???
>>667
そら知ってる人からしたら「ループした話題」だろうよ。
でも、元ネタのスライドショーしかりで、疑問に思う人がいるから話題人なるんだろ
全部自分中心で考えていたら世話ないよ
0669NAME IS NULL2015/09/04(金) 23:14:06.57ID:???
>>668
なに突っかかってるのか知らんけど、定期的にわく話題だから「新たな」じゃねーだろって話
0670NAME IS NULL2015/09/04(金) 23:16:19.48ID:???
過去スレも追わない今を生きる人なんでしょ
0671NAME IS NULL2015/09/04(金) 23:22:39.27ID:???
>>669
突っかかってるのはむしろお前じゃね?
俺の主張は

・話題にしている奴が居る
・それに対して意見を言う奴が居る

この事に対して第三者が「過去に話したことだから話すな」ってのは
自分勝手すぎるだろって言いたいだけだが。
過去スレ追えって言うわりに、どのスレ・レスの事か出さないしな。
(過去スレを誰でも参照できると思っているのかもしれないが
0672NAME IS NULL2015/09/04(金) 23:25:04.84ID:???
定期的に盛り上がってる横から茶々入れる人が沸くよね
何が気に入らないのかわからないけど
0673NAME IS NULL2015/09/04(金) 23:25:26.73ID:???
無駄に沸点低いな
クソガキが来るスレじゃねぇだろ
0674NAME IS NULL2015/09/04(金) 23:26:41.52ID:???
お前だけのスレでもないよ
0675NAME IS NULL2015/09/04(金) 23:46:04.22ID:???
>>671
> 話すな
> 過去スレ追え

いったい誰がそんなことを言ってるんだ?
妄想激しすぎ w
新たな話題じゃないって書いてるだけだろ
0676NAME IS NULL2015/09/04(金) 23:48:35.39ID:???
だからアスペのガキなんて相手すんなっての
どうせ1年持たないでITから居なくなる奴だ
0677NAME IS NULL2015/09/05(土) 00:01:18.89ID:???
>>668
よし、今から別の新たな話をしよう。

トピックはこれにしよう。
ユーザに複数の電話番号を持たせるとして、
ユーザ情報テーブルと、ユーザ電話番号テーブルに分割するか、
ユーザ情報テーブルに配列型で電話番号を複数持たせるか。
0678NAME IS NULL2015/09/05(土) 00:02:25.77ID:???
>>675-676
お前らって寂しいおっさんなんだな
今まで何年もITにいてその地位なんだから、たかが知れてるかw
0679NAME IS NULL2015/09/05(土) 00:03:40.25ID:???
それともこの方がいいかな。
ある会社において、社員番号は再利用されることがなく、ユニークなものである。
ここで、社員テーブルを作るにあたり、サロゲートキーを追加すべきか否か。
これなんて新しい話題じゃないかな?
0680NAME IS NULL2015/09/05(土) 00:06:38.90ID:???
>>675
喧嘩腰に話すと議論になりませんよ。それこそ「突っかかってる」では?

自分の主張は「知らない人にとっては”新しい”」なんですけど。
あなたは詳しいかもしれない。でもそうじゃない人はいる。
このスレは詳しい人専門のスレじゃない。誰も書いていい。

現に>>585のこの一言で、削除フラグがそれに波及する議論がされている。
あなたみたいに詳しい人にとっては「面白く無い」でしょうけど、
そうじゃない人はあなた以外に複数居てやりとりしてる。

それを横から茶々入れるのは止めません?何も得しないでしょ。
0681NAME IS NULL2015/09/05(土) 00:09:00.81ID:???
あ、>>680は>>668ね。俺にガキだ妄想だ何言っても良いけど、
大人なら素直に静観しましょうや。ループしたと思っても、復習するつもりでさ。
0682NAME IS NULL2015/09/05(土) 00:18:57.60ID:???
>>667も別にループしてるからやめろなんて言ってないし、
またこの話かよ程度に静観していたようにも見える。

なんで>>668は喧嘩腰なんだろうな。
0683NAME IS NULL2015/09/05(土) 00:29:11.50ID:???
> あなたみたいに詳しい人にとっては「面白く無い」でしょうけど、
> そうじゃない人はあなた以外に複数居てやりとりしてる。
そうじゃない人って、詳しくない人ってことだろうと思うけれど、具体的に安価をつけてもらえないだろうか。
0684NAME IS NULL2015/09/05(土) 00:47:03.55ID:???
>>677
要件とそのDBMSでの配列型の機能次第

>>679
サロゲートキー論争は定期的に話題になって、大概荒れてうやむやになる
つか分かってててわざと言ってるだろ、お前
0685NAME IS NULL2015/09/05(土) 00:54:24.10ID:???
>>684
> つか分かってててわざと言ってるだろ、お前
そりゃあもう。
>>668がどう思ってくれるか知りたくてな。
0686NAME IS NULL2015/09/05(土) 01:22:24.37ID:???
>>668
それは悪かった。誤解してた。謝罪する。
てっきり、自分の意図しない流れを受け入れられない人だと思ってたよ。

>>683
それこそ「過去スレ見ろ」って事にならないかな?
なんで俺にだけそこまで粘着して嫌がらせのごとく突っかかるのか知らないけど。

>>685
君みたいな人がいるから、同じ話題を嫌がる人がいるというのはよくわかりました。
でも、それを実際にやって証明しようとするのは、凄く性根が腐ってるんですね。
0687NAME IS NULL2015/09/05(土) 01:25:30.78ID:???
レス番間違えた。>>686の一行目は>>682に対するレスね。

ま、こうやって横から意見出してる人間を無理から叩こうとしたり
”わざと”自分が知ってる事をやる人間がいるんだもん。
せっかく盛り上がってた話も台無しだね。俺にもその責任があるわ。
まさかここまで粘着されると思ってなかった。
削除フラグやその関連の話したかった人、ホントすまん。
0688NAME IS NULL2015/09/05(土) 01:45:19.25ID:???
商品マスターの設計なら良いんだけど
個人情報を管理するテーブルで削除フラグはやめて欲しい、マジで
0689NAME IS NULL2015/09/05(土) 02:48:29.57ID:???
>>687
>>686の安価先および削除フラグの話をしていたのは全部俺でして。
話してた相手の方ですか?
0690NAME IS NULL2015/09/05(土) 03:00:59.35ID:???
加えて。

>>686
> 君みたいな人がいるから、同じ話題を嫌がる人がいるというのはよくわかりました。
なぜそんな勘違いをするのか検討がつかない。
DB設計の経験があるなら、あなたも一度は話題にしたことがあるであろう
ありがちなものを「新たな話題」として提示されたときにどう思うかだよ。

あなたが同じ話題を嫌がる人だと証明しようとなんてしていない。
それとも、過去にしたことのある話題を振られたら嫌だったの?
0691NAME IS NULL2015/09/05(土) 05:27:51.29ID:???
>>680
> 喧嘩腰に話すと議論になりませんよ。

お前が言うなよ...w

>>668
> そら知ってる人からしたら「ループした話題」だろうよ。
0692NAME IS NULL2015/09/07(月) 02:19:00.21ID:???
初心者なんですが
テーブルって同じ実体でも読み込みや更新頻度が全然違うときは分けるべきですか?
0693NAME IS NULL2015/09/07(月) 02:39:52.05ID:???
必要なら分ける。そうじゃないなら分けない。
まずは分けずに作ってみたら。
0694NAME IS NULL2015/09/07(月) 06:17:21.74ID:???
>>692
> 分けるべきですか?

なんでそう思ってるのか知らんけど性能とかを気にしてるなら、少なくともこんなスレに質問してる間はデータベースに任せて普通に組んだ方がいい
0695NAME IS NULL2015/09/07(月) 10:19:27.91ID:???
>>634
> 退会しちゃう(しちゃった)人の履歴をどこまで残すかって事でしょ。
> 普通なら、退会と同時(多少時間的な猶予は取るかもしれないけど)に
> 個人情報の抹消はしないといけなくなる。
みたいなこと以外を「例外」だと思う人と、そうは思わない人で意見が違うのかもね。

退職した人の前月の勤怠情報は見ることができないといけないし、
今現在はラインナップから外れた商品の処理も行う必要があるし、
アカウント削除された人が起こしたチケットも処理しなければならない。
0696NAME IS NULL2015/09/07(月) 10:30:06.58ID:???
>>695
退職者の場合は、税務上の記録保存の義務やら、
年金支払いの業務やらで、その後も情報が必要だからじゃないかな。
商品の場合は、販売終了しても保守義務が残ってますし。
それなりの期間情報を持ってないといけないでしょうね。

アカウント削除された人への対応と言うことで、
猶予期間を持たないといけないかもって思いました。
実際サイトによっては、退会後一ヶ月間は取り消し可能です
って言っているところもあります。
0697NAME IS NULL2015/09/07(月) 11:31:05.85ID:???
>>694
>>693
ありがとうございます
まず、普通にやります
0698NAME IS NULL2015/09/07(月) 12:38:35.30ID:???
>>695
アカウントが削除された人が起こしたチケットも表示すればいいのでは。
というか、そういう話が出ていたような気がする
0699NAME IS NULL2015/09/07(月) 12:51:59.57ID:???
>>698
> アカウントが削除された人が起こしたチケットも表示すればいいのでは。
その実装方法として削除フラグで十分な場合もあるのに、なんだか最近バズってる削除フラグ
関連の人たちは、「後から参照することなんてまれだろ」とか「思考停止」とか言ってるのに
違和感を感じてた。
0700NAME IS NULL2015/09/07(月) 14:06:54.57ID:???
ここ最近の削除フラグの話は、多分これが発端。
http://qiita.com/Jxck_/items/156d0a231c6968f2a474
0701NAME IS NULL2015/09/07(月) 14:55:29.08ID:???
>>700
すくなくとも、そこの内容(コメントでのやりとりまで含めて)を
ちゃんと理解した上での議論とは思えんレベルの話しかされてないけど
0702NAME IS NULL2015/09/07(月) 15:13:28.30ID:???
発端の人達以降は読んでないんだろう
0703NAME IS NULL2015/09/07(月) 15:14:29.22ID:???
>>701
このスレの話じゃないよ。
>>700の記事以降、散発的に削除フラグの話がブログに投稿されたりして、
最終的に「論理削除 Casual Talks #1」というイベントで完結した。

あのスライドもt-wada作成だから話題になってるんじゃないかな。
実際のトーク内容はわからないが。
0704NAME IS NULL2015/09/07(月) 15:18:17.49ID:???
トーク内容も、
> 普段から言っている「論理削除するな」「削除じゃないからちゃんと機能を設計しましょう」という内容を
> 話してきました。
http://moro.hatenablog.com/entry/2015/08/31/212013

とかいう話なんで、推して知るべし。
0705NAME IS NULL2015/09/07(月) 15:19:00.04ID:???
あ、>>704はt-wadaじゃない別の人のトーク内容ね。
0706NAME IS NULL2015/09/07(月) 15:32:02.57ID:???
論理削除 Casual Talksでググると、こんな人もいて、
http://ohbarye.hatenablog.jp/entry/2015/09/01/172400
俺的には、どっちが思考停止やねんって感じなんですが。
0707NAME IS NULL2015/09/07(月) 15:46:10.29ID:???
まあ実際問題、削除は状態のケースがほとんどで
消すにしても転記できるならそっちのがよさげ
何年も経つとえらいことになるけどもうどうしようもないしなあ
0708NAME IS NULL2015/09/07(月) 15:55:27.05ID:???
状態が変わったら別テーブルに移動するという解決法以外は、削除フラグだろうがstatusだろうがdelete_atだろうが似たり寄ったり。
0709NAME IS NULL2015/09/07(月) 16:28:57.05ID:???
まあしかし、削除フラグで論理削除して、後はずっとそのまま
これが実装コストが一番低いんだよな

保険的な意味合いで要件的に不要でもそうする事は多い
これを思考停止ととるか(バッド)ノウハウと考えるか
0710NAME IS NULL2015/09/07(月) 17:01:33.00ID:???
流出したときのコストは莫大
0711NAME IS NULL2015/09/07(月) 17:47:26.85ID:???
消すべき個人情報が入ってるという前提かな
バックアップもあるしログに気を使わないとならんこともあるからな
0712NAME IS NULL2015/09/07(月) 18:09:39.89ID:???
今削除フラグが云々って騒いでるのって、Web屋でしょ
0713NAME IS NULL2015/09/07(月) 18:28:24.46ID:???
>>706
極論にしか辿り着けない人もそりゃ出るわね
客の要件を聞かない、聞いても考えない、
そんな一歩目から足踏み外してる人向けのスライドなんだし
0714NAME IS NULL2015/09/07(月) 20:51:11.67ID:???
>>709
実装コストが低いってかなり大事だよな。
なんかやたらと正規化・論理的な設計を好む流れあるけど。

同様に「仮登録」も、同じテーブルに入れて状態フラグで判定してもいいと思うんだよな。
0715NAME IS NULL2015/09/07(月) 20:57:29.92ID:???
「仮登録」が間違いなく「本登録」までいくなら良いんだけど
そうならないときに、ゴミが残るっていやがるお客がいたっけ。
しかも、シリアルが飛ぶのも駄目だとか言い出したな。
0716NAME IS NULL2015/09/07(月) 21:00:04.68ID:???
>>715
その気持ちは分かるけど、俺は逆に仮登録と本登録の違いぐらいで
全く同一のテーブルを複数用意する事に違和感感じるんだよな
0717NAME IS NULL2015/09/07(月) 21:23:24.18ID:???
仮登録の段階でもろもろ入力させるかどうかに依存する話のような。
メールアドレスのベリファイ目的なら、仮登録待ちメールアドレスと認証コードだけのテーブルでいいだろうし。
0718NAME IS NULL2015/09/07(月) 21:46:35.19ID:???
履歴テーブルってどこまでを指すんだろうな
顧客情報のみならまだしも、ECなら購入履歴とかお届け先とか
そういった関連テーブルも物理削除して履歴テーブルに残すべきなのだろうか
0719NAME IS NULL2015/09/07(月) 22:13:20.15ID:???
購入履歴って、誰に何を何時売ったかという販売情報の事ですか?
それなら消せないんじゃないですか。
お届け先も、同様に、どこに届けたかなので、消せないと思います。
今後のサポートで必要でしょうし、税務上も消すとまずいと思います。
0720NAME IS NULL2015/09/07(月) 22:36:01.10ID:???
>>719
ということはだよ、顧客テーブルも削除フラグで良くないか?ってなるんだよな。
顧客テーブルだけ履歴に移して、関連テーブルは削除フラグで見えなくする。
これこそおかしくないか?って俺は感じるんだよ。
0721NAME IS NULL2015/09/07(月) 22:40:15.16ID:???
顧客テーブルは履歴に残さなくて良いと思います。
残さなくてはいけないのは販売の記録でしょう。
商品に対する将来のサポートで必要な販売情報と、
顧客テーブルにある情報は違うと思うんです。

間違っているのかなあ。
0722NAME IS NULL2015/09/07(月) 23:21:57.25ID:???
>商品に対する将来のサポートで必要な販売情報
顧客テーブルがないとサポートするのに”誰に”売ったか分からないのでは?
0723NAME IS NULL2015/09/07(月) 23:31:38.34ID:???
そうなると顧客がどういう状態になったときに「削除フラグ」を立てるのかもよくわからんなぁ。
0724NAME IS NULL2015/09/07(月) 23:45:41.28ID:???
最初は普通に消すように作るんだけど
テストでデータ蓄積されてくると、たんなる削除だと
>>722みたいなことになるので削除フラグに行き着く
でもそもそも削除するようなレコードは履歴に残しちゃいけないわけで
テーブル増やして適切に対応するべきだけど
カラムが増えるのは躊躇しないくせにテーブルが増えるのは嫌がる人が多い
0725NAME IS NULL2015/09/07(月) 23:54:42.04ID:???
>>724
俺もテーブル増えるのは嫌がる方なんだが、
履歴とはいえ、似たようなテーブルが増える事ってアンチパターンにならないの?
0726NAME IS NULL2015/09/07(月) 23:56:06.77ID:???
販売情報の中に、何時誰に何をいくらで売ったか、
配達先の住所、電話番号を記録しておけば良いんじゃないかな。

これは、いわゆる販売伝票と同じですよね。
顧客テーブルは、客から申し出があれば物理削除しないといけないでしょうjが、
こちらは消すわけにはいかないでしょう。
0727NAME IS NULL2015/09/08(火) 00:01:05.15ID:???
コンビニでいつ何を買ったか個人と紐付けられるのは嫌だなぁ。
電子マネーの番号と紐付けられるのすら嫌がる人も多いから、個人を特定できない状態で保存しているというのに。
0728NAME IS NULL2015/09/08(火) 00:18:02.16ID:???
>>726
配達先が購入者でない場合は?贈答品とかだとそういうケースも有るよね。
ということはやはり、元となる購入者の情報(顧客テーブル)も
削除できないってことになると思う。
0729NAME IS NULL2015/09/08(火) 00:28:00.26ID:???
おそらくですが、
その商品の販売に当たり、何を記録として残さないといけないか?と言うことじゃないですかね。
顧客テーブルとして残すというより、その販売レコードに、支払いをした人(購入者)の情報を
入れるだけだと思うんですが。お金の動きの記録と、販売物の動きの記録とが残る感じです。
0730NAME IS NULL2015/09/08(火) 02:04:24.98ID:???
>>729
その設計を頭の中で描けてる?

顧客テーブル→注文履歴→注文商品→商品情報
                →お届け先

ってのが一般的な繋がりだと思うけど、
注文履歴(販売レコード)に購入者の情報まで入れちゃうと、
それこそ正規化出来てないんじゃないか?
07317302015/09/08(火) 02:11:07.35ID:???
ごめん。前言撤回する。勘違いしてた。
注文履歴に顧客情報必要だわ。顧客情報編集されたら情報が変わる。
0732NAME IS NULL2015/09/08(火) 08:29:49.75ID:???
顧客の要請に応じて個人情報は消さにゃならんのに、注文履歴は残さにゃならんとは。客商売は難儀だね。
0733NAME IS NULL2015/09/08(火) 08:47:17.59ID:???
>>715
客に見せるためのシリアルと別に内部処理用の代理キーをわざわざ用意せにゃならん流れだなそれ、面倒くさ
0734NAME IS NULL2015/09/08(火) 10:09:03.44ID:???
>>732
> 顧客の要請に応じて個人情報は消さにゃならんのに、注文履歴は残さにゃならんとは。
まぁ、売上分析とかありますし……。
0735NAME IS NULL2015/09/08(火) 10:29:23.59ID:???
削除フラグに親を殺されました人が出るって有名な場所でね
注文履歴に残る顧客IDはどうするの?って聞かれたんですよ
同じ事態になるヌルオブジェクトパターンは採用できない
だからNULLにする、NOT NULL制約なしですよ、背筋がゾゾゾー!って
でも外さないといけない
やだなーこわいなーやだなー
って運用してたら、出たんです
誰も知らない注文履歴が…
0736NAME IS NULL2015/09/08(火) 11:17:08.95ID:???
個人情報保護法的には、会員辞める=会員が登録したレコードを削除
するのが当たり前というか適切な対処法のように感じる。
どうせアプリ側でも削除する時に「元に戻せませんよ?」メッセージ出すだろうし。

で、退会した奴が犯罪者とか曰くつきの奴で情報開示を求められた時は、
DBバックアップしていたデータを復元して提示すると。
Web系で利用者数も少ないなら、こんな管理方法でもおkな気がする。
0737NAME IS NULL2015/09/08(火) 11:43:16.92ID:???
>>736
> 個人情報保護法的には、会員辞める=会員が登録したレコードを削除
> するのが当たり前

という要件が世界の全てなのかな?
0738NAME IS NULL2015/09/08(火) 12:00:24.72ID:???
>>737
さすがにそこまで極論を述べる気はないです
0739NAME IS NULL2015/09/08(火) 12:14:31.79ID:???
>>736
個人情報保護法的には、レコード(行)を削除する必要なんてないんじゃね
ただそのレコードに記録された特定個人情報が無くなれば良いだけだろ
たとえば名前を空白とか「名無し」とか「削除」とかにすればいい

情報開示をもとめられても、削除した情報は削除したと開示するだけ
保存義務がある情報を削除してたらどうなるか知らんが
0740NAME IS NULL2015/09/08(火) 12:34:08.76ID:???
>>739
>たとえば名前を空白とか「名無し」とか「削除」とかにすればいい

本当にそんなことしてるのか?
0741NAME IS NULL2015/09/08(火) 12:50:39.26ID:???
削除マークの是非と個人情報の取扱いは別の話だと思うけど
0742NAME IS NULL2015/09/08(火) 13:06:07.17ID:???
そもそも、個人情報保護法では「注文履歴」は保護されない
0743NAME IS NULL2015/09/08(火) 13:28:52.12ID:???
>>736
こういう奴が、削除フラグとか論理削除とかの単語を見ると発狂するのかも
0744NAME IS NULL2015/09/08(火) 13:47:43.27ID:???
>>743
既に削除フラグや論理削除に発狂している人達がいるわけで・・・
0745NAME IS NULL2015/09/08(火) 15:26:13.67ID:???
>>708
> 削除フラグだろうがstatusだろうがdelete_atだろうが似たり寄ったり。
これ全部、論理削除
0746NAME IS NULL2015/09/08(火) 15:35:15.32ID:???
「論理削除」ってなんだよって話じゃないの?
削除したいけど削除したら困るから何かと理由をつけて残していますというだけで、
つまりは「削除できませんでした(orしたくありません)」の意思表明なんだよね。
0747NAME IS NULL2015/09/08(火) 15:37:22.76ID:???
削除したら困るなら残せばいい話でしょ
削除しても困らないけどとりあえず残しとくという話でないの?
0748NAME IS NULL2015/09/08(火) 15:43:29.76ID:???
削除したら困るって人、結構いるよ。
売上管理ができないとかなんとか。まさかwって思うよね。
0749NAME IS NULL2015/09/08(火) 16:04:08.78ID:???
売上げ管理で物理削除したら、監査上問題がある。
行うにしても履歴を残さないとまずい事が起きる。
0750NAME IS NULL2015/09/08(火) 17:37:35.06ID:???
それって請求書とか発注書とか別に紙ベースの証拠持っておいて、
経理処理の時に精査するんじゃないの?
わざわざDBのデータ参考にするって、外部のサービスでも使わないかぎり、
証拠になりづらいと思うんだけど。(値なんていくらでも操作できるんだし
0751NAME IS NULL2015/09/08(火) 17:48:28.20ID:???
>>742
「当該情報に含まれる…記述により」(それ自体、あるいは他の情報と照合して)特定できる、なので
個人情報とは、個人がどこの誰かを述べる機能を担う部分だけを指すのでなく
特定個人と結びつく情報の全体をさす。
注文履歴にお客様IDが入っていないとは考えにくいから、
個人情報保護法で注文履歴は保護される。
0752NAME IS NULL2015/09/08(火) 17:56:52.41ID:???
お客様IDと個人が紐付かなきゃいいだけ
履歴とIDだけ流出したって何の情報にもならない
0753NAME IS NULL2015/09/08(火) 18:23:59.12ID:???
>>751
もっと勉強しなよ
0754NAME IS NULL2015/09/08(火) 18:25:54.13ID:???
つか、まさか、個人情報を扱うシステムは作ってないよな?
0755NAME IS NULL2015/09/08(火) 19:24:06.76ID:???
そのうちマイナンバーの話が出てくる
0756NAME IS NULL2015/09/08(火) 19:44:00.31ID:???
マイナンバーは経路暗号化したって結局末端じゃ収集し放題だからなー
独自IDと違って変わらない番号だから取り扱いに気を使いそうだ
0757NAME IS NULL2015/09/08(火) 23:04:24.85ID:???
>>736
個人情報保護法的に削除してって言われた個人情報をバックアップデータに保存してるのは許されるんだっけ?
詳しい人解説よろ
0758NAME IS NULL2015/09/09(水) 00:24:03.03ID:???
>>752
法が注文履歴を個人情報として保護するかどうかは、流出するかしないか、
流出先あるいは事業者が外部に提供した先で紐づくかどうかは無関係。
「当該情報を保有する事業者において」他の情報との照合ができれば個人情報となるという解釈とされているから。

お客様IDを削除または一方向ハッシュ関数などで変換すると今度の改正で出来た「匿名加工情報」になる。
0759NAME IS NULL2015/09/09(水) 00:44:03.13ID:???
確認ついでに調べてみたら
今度の改正で「個人識別符号が含まれるもの」が陽に追加されてた。
http://www.cas.go.jp/jp/houan/150310/siryou3.pdf (11-12ページ)

ここも参照
http://japan.zdnet.com/article/35066449/2/
0760NAME IS NULL2015/09/09(水) 01:46:42.69ID:???
>>758
他の情報とどうやって照合するの?
ただの数字しかないんだよ
0761NAME IS NULL2015/09/09(水) 01:50:49.26ID:T/RvuaVF
アンチパターンである垂直分割について教えてください。

例えばSNSなんかの会員テーブルには、
アカウントとプロフィールと称したカラムが複数存在します。
ですので、1対1であっても垂直分割して
アカウント関係だけのテーブルと、プロフィール関係のテーブルを作る事があります。

こういうやり方はアンチパターンとして、やはり駄目なのでしょうか?
0762NAME IS NULL2015/09/09(水) 07:50:49.87ID:???
>>761
垂直分割がアンチパターンだってソースは?
ふつうアンチパターンだって説明してあるなら、そこになぜダメかも書いてあるだろ
0763NAME IS NULL2015/09/09(水) 12:52:41.95ID:???
>>762
「達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ」
って本に書いてありました。割と有名な本かと。

ですが、アンチパターンとしての意味は書いてあるものの、
要件毎については書いてないので、>>761みたいな場合でも
アンチパターンに該当する(やっちゃ駄目)なのかと思い、質問しました。
0764NAME IS NULL2015/09/09(水) 13:40:16.82ID:???
>>763
確認したら、ちゃんと理由がかかれてたけど。

> 欠点1 分割する意味的な理由がない これはすべてのパターンのテーブル分割に該当することですが、
> このようにテーブルを分割する理由は、正規化の理論からは出てきません。純粋にパフォーマンスという
> 物理レベルの要請によるものなので、逆に言うとその要請がなければ実施する必要のないものです
0765NAME IS NULL2015/09/09(水) 14:31:15.51ID:???
>>764
ですので、>>763の4行目にも書きましたが、
>>761こういう要件についてはどうかな?と思い、質問しました。
0766NAME IS NULL2015/09/09(水) 14:33:19.27ID:???
>>765
?
要請があったのなかったの
0767NAME IS NULL2015/09/09(水) 14:37:17.18ID:???
>>766
何の要請ですか?
0768NAME IS NULL2015/09/09(水) 14:38:30.49ID:???
>>767
いや。この日本語の意味分かってんのかなーって。

> 純粋にパフォーマンスという
> 物理レベルの要請によるものなので、逆に言うとその要請がなければ実施する必要のないものです
0769NAME IS NULL2015/09/09(水) 14:41:18.24ID:???
>>768
もちろんです。>>763にも書きましたが、本を読んだ上で質問しているので。
とりあえずらちがあかないので、>>761でも正規化の概念からアンチパターンだとします。
0770NAME IS NULL2015/09/09(水) 14:43:45.69ID:???
あ、軽くキレてる?
アカウントテーブルにプロフィールを載せるべきか否かって話をしようとしているなら、
そこに垂直分割なんて言葉は出てこないはずだもんな。本を読んだなら。
0771NAME IS NULL2015/09/09(水) 14:52:49.09ID:???
>>764
すくなくとも翔泳社のサイトで見れる範囲で確認したとろこでは、それは水平分割の話だが
すべてのパターンってのがどこまでかかってるのかはよくわからんけどな
0772NAME IS NULL2015/09/09(水) 14:54:49.89ID:???
>>770
いや、キレてないです。
著者の言うとおり、パフォーマンスの問題がある時は分割する事を考えろ
ってスタンスは確かにそのとおりだと思うのですが、
設計って開発前段階の事じゃないですか。

開発前で1テーブルにカラム数が増える。
これは1対1でも用途毎に分けるべきじゃないか?
それも正規化の内に入らないか?いやいや、アンチパターンに変わりないか。

そう、色々と考えて質問した次第です。
「俺はこうしてるよ」とかそういう意見が聞きたかったのですが、
日本語の意味とか質問の粗を指摘されているようで話が進まないので、
「それでは>>761はアンチパターンという事で、皆さんも使わないんですね」
として、理解させていただいた次第です。
0773NAME IS NULL2015/09/09(水) 15:03:11.37ID:???
垂直分割にしても、すでに正規化されているテーブルを、性能対策のために垂直分割する事について書いてあるように見える
そもそも性能対策としてテーブル分割するのはバッドノウハウだって話なんじゃないのか
0774NAME IS NULL2015/09/09(水) 15:09:28.15ID:???
>>772
そう書いてくれりゃいいのに。
逆に言えば、意味的に異なる情報群が存在するとき、
関係が1対1のものはすべてひとつのテーブルにまとめるべきか否か。

で、>>772の出した結論は、まとめないのはアンチパターンであると。
0775NAME IS NULL2015/09/09(水) 15:13:24.54ID:???
>>774
いや、私自身の結論は全てに>>761で書いてます。
「やっぱりアンチパターンとして駄目ですかね?」って聞いてるわけですから。

ですが、「アンチパターンだけどこういう時に使うよ」とか
「それはアンチパターンとは思わない」とか、”自分なりの意見”があると思います。

ですが、ここまで私にそれを指摘してくれた人は居ません。
”自分はこうしてる・こう思う”という意見が聞きたかったのですが、
結局、自分で納得するしか他ありませんでした。
0776NAME IS NULL2015/09/09(水) 15:15:35.57ID:???
>>775
そもそも、ここでいう「垂直分割」に当てはまらないよねというのが、すでに提示した俺の意見だけど。
0777NAME IS NULL2015/09/09(水) 15:19:52.22ID:???
>>776
では、「どうして垂直分割に当てはまらないと思ったか」
を教えてくれたら良かったのではないですか?

上で話されている削除フラグの件は、皆さん自分なりの考え方をされています。
頭ごなしに「削除フラグはアンチパターンだから駄目」とかそういう決め付けをせずに、
自身の経験と考えのもと、「俺はこう思う」と話をされています。

ですが、あなたは基本的に私の質問を指摘したいだけで、
自分の意見も答えの導きもされていないように感じます。偉そうで申し訳ないですが。
0778NAME IS NULL2015/09/09(水) 15:27:49.06ID:???
その削除フラグの話も俺してたよ。

正規化のみでは発生しないけれど、モデリングの観点で分割すべきと判断した結果生まれた1...1のリレーションでしょ?
今言っている「垂直分割」は、パフォーマンスを理由に、あるモデルをそれ以上分割することでしょ?
だから違うものだよ。
0779NAME IS NULL2015/09/09(水) 15:30:29.96ID:???
その本に、
>バッドノウハウ(アンチパターンの事だな)は、正規化からは導かれません。また、非正規化によって生まれるわけでもありません
って書いてあるのに、なんで
>正規化の概念からアンチパターンだとします。
という結論になるのか理解できん
0780NAME IS NULL2015/09/09(水) 16:23:11.48ID:???
>>765
「こういう要件」って言われても、会員を管理することと、アカウントとプロフィールを管理するという
だけで、それは要件とは言いません。
それら情報の位置づけはどうなのか、データの発生時期はいつなのか、それら情報の公開範囲は
どうなのか等々、そういうのが要件です。

そういう要件を加味してモデリングするのが設計です。

「会員がいてアカウント情報とプロフィールがあるんだけど、それを別テーブルにするのは
アンチパターンですか?」という問いには、誰も答えられません。

>>771
「すべて」には水平分割も垂直分割も含まれています。
0781NAME IS NULL2015/09/09(水) 16:38:12.51ID:???
なんだかいじわるな人が多いスレですね
0782NAME IS NULL2015/09/09(水) 16:52:59.54ID:???
こういう答えを期待してるのかな?

> これは1対1でも用途毎に分けるべきじゃないか?
用途毎に分けるべき。

> それも正規化の内に入らないか?
用途毎に分けることを正規化とは言わない。

> いやいや、アンチパターンに変わりないか。
用途毎に分けることは、アンチパターンではない。
0783NAME IS NULL2015/09/09(水) 16:55:45.60ID:???
同じような話は前スレからあって、このスレの先頭でもその話題についてのコメントがある。
「課金情報」と「請求情報」は分けるべきか否か。
0784NAME IS NULL2015/09/09(水) 16:59:04.24ID:???
意地悪とは撮らず、アドバイスとか貴重な意見として聞いた方がいいよ

良薬口に苦しって昔の人も言ってたし。
0785NAME IS NULL2015/09/09(水) 17:03:17.24ID:???
お前らが嫌いなWebのアプリの話して済まんが、
EC-CUBEとか1つのテーブルでアカウントとプロフィールを一緒くたにしてるけど
俺の感覚では、あれは酷いなって思ったけどなぁ
0786NAME IS NULL2015/09/11(金) 23:18:54.06ID:cnT3g/XI
データベース関係について語り合うならBeLongs!がおすすめ。
よかったら、「BeLongs! - トップ」で検索してみて!
0787NAME IS NULL2015/09/12(土) 00:15:45.91ID:???
またこれか
0788NAME IS NULL2015/09/12(土) 00:18:47.06ID:???
複数のスレに同じ内容書いているし、これは広告なのか?
0789NAME IS NULL2015/09/12(土) 02:14:01.61ID:???
単なるマルチポストでしょ。意味ない(むしろマイナス)なのにやりまくる情弱
0790NAME IS NULL2015/09/14(月) 08:59:25.35ID:???
かなりの初心者で恐縮なのですが質問をさせて下さい。
Androidアプリで使用するデータベースの設計をしています。その中でユーザーにアンケートを定期的に配信してデータを管理したいと考えています。
初めは、回答ID、設問ID*、ユーザーID*、回答結果みたいなテーブルを考えていますが、何となくこれでいいのかなーと疑問があります。
このような持ち方の場合アンケート配信が増えれば増えるほどレコードは増えていきます。集計してデータを使う時に負荷は大丈夫なのかな?と素人ながらに考えてしまいます。
データの利用方法はアンケート結果を元にユーザーを絞り、関係性の高いユーザーに特定の更新情報をプッシュ通知するという使い方なので、頻度がかなり高いです。
検索ワードでも結構なのでヒントを頂けないでしょうか。よろしくお願いいたします。
0791NAME IS NULL2015/09/14(月) 09:46:32.25ID:???
>>790
1回のアンケートの回答数なんてせいぜい数百件程度だろw
その心配は杞憂だから気にすんなw
0792NAME IS NULL2015/09/14(月) 10:02:50.43ID:???
>>791
ありがとうございます。気にせずに行きます。
0793NAME IS NULL2015/09/14(月) 17:24:05.90ID:???
>>790
RDBMSじゃなくてRedisとかがいいかもよ。
使ったことないけど。
0794NAME IS NULL2015/09/14(月) 18:25:12.25ID:???
>>790
この設計なら回答テーブルはほぼID管理になるから、
レコード数が数千万とかになっても大丈夫じゃないか?インデックスも効くし。
フリーテキスト(備考とか)を入力させたい場合は、別にテーブル作ればいいじゃん。
0795NAME IS NULL2015/09/15(火) 10:55:56.48ID:???
>>794
「関連性の高いユーザ」を決定するのに、常に全件検索になったりしない?
0796NAME IS NULL2015/09/15(火) 11:03:42.87ID:???
なってもたいしたことない
0797NAME IS NULL2015/09/15(火) 12:12:27.15ID:???
>>795
どういう関連性かわからないからなんとも。

ただ、「設問ID1を3と答えた男性のみ絞り込み」などの条件検索をする場合、
>>794の設計だとインデックスが効くから問題ないと思うよ。
気になるなら1度にSQLを実行しようとせずに、
まずは回答テーブルから条件に一致するユーザーIDを取得して、
それからユーザーテーブルを絞り込めばいい。
0798NAME IS NULL2015/09/15(火) 12:48:52.29ID:???
790です。
丁寧に議論して頂きありがとうございます。
あるジャンルに特化したQ&Aサービスの設計をしています。
QAサービスは質問内容がマニアックになればなるほど回答数が減ってしまいます。それを改善するために、質問内容や質問者の属性に近い人にのみ質問内容をプッシュ通知したいと考えています。
利用者全員に毎回プッシュすると、利用者はうっとおしくなるので、回答結果を見ながら少しずつプッシュするユーザーを広げていく仕組みです。
本当は沢山の係数を保持してベイジアンネットワークのような仕組みで自動的に絞り込みたいのですが、初心者の僕にはそのようなものを作るのは無理なので、最初は簡易的な仕組みを構築したいと考えています。
スタート時のアンケート結果はyes or noのみになるように考えています。
集計するタイミングは二通りになります。
2,3個の属性から該当ユーザーを絞り込み、さらにそこからランダムで数十人程度に絞り混むプログラムでの使用。
回答が集まらない場合に運用側が任意に再度集計し直して再配信するときに使用。
ディレクター経験はありますがプログラム、データベースの経験は皆無なので今は仕様を固めながらデータモデリングをしている最中です。
曖昧な内容の質問に対して議論して頂きありがとうございます。参考になります。
0799NAME IS NULL2015/09/15(火) 13:09:35.90ID:???
お前はまず改行の方法を覚えろ
0800NAME IS NULL2015/09/29(火) 21:57:10.96ID:SiAsvmBt
NoSQLの特徴をググっていたら、関係モデルの結合操作を利用しないという
利点があると書いてありましたが、それって利点なのでしょうか?

なんか、非正規化されたデータを扱うってだけじゃないかと
思いました。
0801NAME IS NULL2015/09/29(火) 22:00:03.05ID:???
結合してもしなくてもメリット・デメリットはあるからねぇ
0802NAME IS NULL2015/09/29(火) 22:12:40.37ID:???
joinしないことそれ自体が利点じゃなくて、その結果クエリが速い、ってのを誤読したんだろう。
本当にjoinを使わないことが利点だと書いてあったんだったらちょっとURL晒してみそ。
0803NAME IS NULL2015/09/29(火) 22:32:20.58ID:SiAsvmBt
>>802

http://www.wingarc.com/product/dr_sum/lineup/engine/engine_01.html

このビックデータを扱う製品を調べているのですが、一番下に
「DB設計による正規化の作業は不要」とあるんですよ。

つまり、結合操作を利用しないことが利点として書かれていると思うのですが、
何か引っかかるものがありまして。。。
0804NAME IS NULL2015/09/29(火) 23:05:39.51ID:???
利点はレスポンスだって書いてるじゃん。
まあたしかに、そこに書いてある謳い文句もインチキくさいけどな。
そもそも正規化はパフォーマンスを目的にやるもんじゃないし、ユーザーが理解しやすい形式
云々については>>800の言うとおりだと思う。
0805NAME IS NULL2015/09/30(水) 01:13:07.00ID:???
データウェアハウスとかは、ちょっと変わった設計が必要だったりするけど
まあ、単なる宣伝文句だな。言葉半分ぐらいに受け取っておくべし
0806NAME IS NULL2015/10/02(金) 00:37:55.33ID:d8XiKdgT
最近はエクセルもしくはcsvをキーバリューで持っておけばルックアップが楽だと気づいたよ
0807NAME IS NULL2015/10/02(金) 04:47:54.88ID:???
データの使い回しって意外と難しいですからね。
そのサイト・プロジェクト・アプリならではの設計をしていたりするので、
オーソドックスな使い方では無理だったりするし。
結局、設計思想まではパクれないってことで。
0808NAME IS NULL2015/10/03(土) 12:14:09.12ID:/Pljy+Uz
話をぶり返して申し訳ないのですが、気になるので質問します。

上のレスに削除フラグの話がありまして、
「削除フラグを止めて、削除履歴が必要な場合は別テーブルに保存する」
というのがベストプラクティスな方法としてオススメされているかと思います。

そこで疑問に思ったのが、ユーザーデータやユーザが投稿したテーブルのデータは
どのように扱うべきなのでしょうか?削除(退会/解約)申し込みがあった時点で、
DBから全ての関連データを削除するべきでしょうか?

それともユーザーテーブルのみ削除して、
関連テーブルのデータは残しておくべきでしょうか?

要件や仕様次第というのは分かりますが、オーソドックスな方法として、
「まずはこうするべき」という考え方が知りたいので、ぜひ教えてください。
0809NAME IS NULL2015/10/03(土) 13:40:32.70ID:???
>それともユーザーテーブルのみ削除して、
>関連テーブルのデータは残しておくべきでしょうか?
参照整合性を考えるとあり得んな
マスタレコードを履歴テーブルに移動させるなら、そのタイミングで
関連テーブルも履歴テーブルに移動させるのが順当だろ
0810NAME IS NULL2015/10/03(土) 13:52:06.57ID:???
>>809
>マスタレコードを履歴テーブルに移動させるなら、そのタイミングで
>関連テーブルも履歴テーブルに移動させるのが順当だろ

それだとユーザーが使用する関連テーブルが複数あると
その数だけ履歴テーブルも増えるわけですが、おかしくないでしょうか?

マスターを履歴テーブルに残すだけなら、最低限「どのユーザーが削除したか」
が分かりますし、後でバックアップから復元もできます。
でも、関連テーブルも同じように「履歴」とするのは違和感あります。
0811NAME IS NULL2015/10/03(土) 14:02:29.62ID:???
>その数だけ履歴テーブルも増えるわけですが、おかしくないでしょうか?
履歴を別テーブルにして持つなら、履歴とるテーブル数だけ履歴テーブルが必要なのは当然
なにがおかしいのか分からんが

>関連テーブルも同じように「履歴」とするのは違和感あります
お前の違和感はお前が解明して説明してもらわんと知らんがな
関連データってのがまさにトランザクションで履歴そのものでもあるってならほっとけば良いんじゃね
0812NAME IS NULL2015/10/03(土) 15:04:38.72ID:???
>>809
厳密に言うと、あり得んのは参照整合性が必須な場合だけであって、それが必要ない設計なら
別に問題ないな。
参照整合性が必須な場合というのはたとえば、サロゲートキーを使用していてマスターを削除すると
キーが意味を持たなくなる場合とか。
0813NAME IS NULL2015/10/03(土) 18:49:33.94ID:???
制約張るかどうかは別にして
参照整合性が必要ないデータを関連データと呼ぶのか
0814NAME IS NULL2015/10/03(土) 19:09:14.01ID:???
特定のモデリング手法において特定の意味を持った術語として用いることはあるけど、
そういう文脈以外で一般名詞として使うことはあるだろ。
>>808はどうみてもモデリングの用語として使っているようには見えないし。
0815NAME IS NULL2015/10/03(土) 21:28:49.11ID:???
よくあるSNSを例に考えてみよう

ユーザーテーブル
└日記テーブルへの投稿
└写真テーブルへの投稿
└掲示板テーブルへの投稿*
└お問い合わせテーブルへの投稿*

このうち、*はユーザーテーブルを削除しても元テーブルに残しても良いと思う。
ユーザーの個人情報となる、日記・写真に関しては削除して、
履歴テーブルへの移行もいらないと思う。
0816NAME IS NULL2015/10/03(土) 22:59:32.81ID:???
思うのは勝手だがせめて根拠ぐらい言え
0817NAME IS NULL2015/10/03(土) 23:37:53.50ID:???
>>815
退会するユーザに選択権があってもいいんじゃないって思う
0818NAME IS NULL2015/10/04(日) 00:36:09.65ID:???
関連データの定義と履歴保存の必要範囲を明らかにしてから議論してくれ
投稿したユーザが分からん投稿は、投降したユーザの関連データなのか?
ユーザが削除されたときに、そのユーザの過去の投稿は履歴として保存する必要があるのか?
0819NAME IS NULL2015/10/04(日) 00:43:43.58ID:???
ユーザーの状態であっちこっちの外部キーが
NULLになったり元に戻ったりするとか
おっかなくて触りたくないぜ
0820NAME IS NULL2015/10/04(日) 03:52:52.19ID:???
>>817
退会するユーザに選択権って、
「退会しますが、あなたのデータを削除しますか?残しますか?」
ってことか?そんなサイト見たこと無いんだが。あるなら教えてくれw
0821NAME IS NULL2015/10/04(日) 08:29:49.58ID:???
>>819
珍しい機能が付いてるな
0822NAME IS NULL2015/10/04(日) 18:19:16.82ID:???
結論 要件次第
0823NAME IS NULL2015/10/04(日) 18:43:25.31ID:???
www
0824NAME IS NULL2015/10/05(月) 10:33:43.19ID:???
しょうがねぇな。俺がベストプラクティスを教えてやる。
答えは「論理削除しない」だ。物理削除すればいい。
ユーザーが投稿した関連テーブルも全てだ。

そして退会情報が欲しい場合は履歴テーブルに最低限の情報を移せばいい。
どうせ退会日時と退会理由ぐらいしか保存しないだろ。

万が一過去データを閲覧する必要があった場合にそなえ、
バックアップを取ればいいだけ。アーカイブから復元して確認しろ。
0825NAME IS NULL2015/10/05(月) 10:34:11.90ID:???
>>808
根本から勘違いしてるよ。

> そこで疑問に思ったのが、ユーザーデータやユーザが投稿したテーブルのデータは
> どのように扱うべきなのでしょうか?削除(退会/解約)申し込みがあった時点で、
> DBから全ての関連データを削除するべきでしょうか?

「削除すべき」場合にどう「削除」するのかというのが削除フラグの議論。
0826NAME IS NULL2015/10/05(月) 10:40:34.39ID:???
>>808
> 要件や仕様次第というのは分かりますが、オーソドックスな方法として、
> 「まずはこうするべき」という考え方が知りたいので、ぜひ教えてください。

まずはこうするべきなんて考え方はない。
削除するのかしないのかは要件次第。

例えば、BTSならあるユーザが「削除」されたとき、そのユーザがOpenしたTicketが消えたら困るだろ?
0827NAME IS NULL2015/10/05(月) 10:43:28.40ID:???
で、その場合に、
* ユーザは「削除する」
* そのユーザの過去の行動履歴(TicketのOpen/Assigned/Closeなど)は残さなければならない

という要件を満たす必要があり、「ユーザを削除する」方法はどうすべきかというのが
削除フラグの議論。
0828NAME IS NULL2015/10/05(月) 10:46:18.54ID:???
>>826-827
これに一票
基本は『ユーザは「削除する』をしてれば問題ないよ。
どうすべきか否かや履歴テーブルは次のステージだと割り切ればいい。
0829NAME IS NULL2015/10/05(月) 12:23:44.90ID:???
違う、要件の問題だ。
0830NAME IS NULL2015/10/05(月) 14:35:05.67ID:???
要求仕様(要件)と実現方法(実装仕様)の区別がついてない奴がいるな
0831NAME IS NULL2015/10/05(月) 15:16:31.13ID:???
どう違うか教えて〜><
0832NAME IS NULL2015/10/05(月) 15:40:29.31ID:???
>>831
気持ち悪い
0833NAME IS NULL2015/10/05(月) 16:24:42.06ID:???
説明できる人がいません
0834NAME IS NULL2015/10/05(月) 16:46:16.36ID:???
まじで?
0835NAME IS NULL2015/10/05(月) 17:09:06.58ID:???
まじ。偉そうに適当なこと言ってるだけだから
0836NAME IS NULL2015/10/05(月) 17:56:57.57ID:???
>>835
煽っても無駄だよ
知りたきゃググれ
0837NAME IS NULL2015/10/05(月) 17:57:52.95ID:???
つか、要求仕様と実装仕様の区別もつかんなんて、ド素人か?
0838NAME IS NULL2015/10/05(月) 18:06:58.26ID:???
>>808
削除フラグをやめる=そのテーブルから削除する(履歴テーブルへの移動含む)
じゃないぞ。
日付情報を付加するというやり方もある。
0839NAME IS NULL2015/10/05(月) 21:04:32.15ID:???
それアンチパターンだよ
0840NAME IS NULL2015/10/05(月) 23:03:31.04ID:???
>>827
「過去の行動履歴」を残すことが「ユーザー」を削除することの妨げになるってのがそもそもわからん。
それが問題となるような設計が前提だから問題なんじゃねぇの?と思う。
0841NAME IS NULL2015/10/05(月) 23:49:39.13ID:???
>>840
行動履歴テーブルにユーザ一名をそのまま入れてるとか?
それはそれであまり近くにいて欲しくないなぁ
0842NAME IS NULL2015/10/06(火) 00:13:11.62ID:???
そのユーザー名が残すべき側のデータなんであればそもそも消すべきデータと一緒に
されるべきではないし、履歴の方に持たせて更新異常の問題が発生するならば
正規化すればいいだけの話。
逆に、そういう問題がないのであれば別に履歴の方にあってもいいわけで。
0843NAME IS NULL2015/10/06(火) 05:57:20.47ID:???
ユーザー名とか名前を履歴テーブルに残す理由って、
要はテーブル見たら誰の履歴かわかりやすくするためだけだろ?
それってつまり履歴テーブルを見る事前提な設計なわけで、
削除フラグの代わりとして使うという意味ではなくなるぞ。
0844NAME IS NULL2015/10/06(火) 06:38:16.04ID:???
削除フラグの代わりってなんのことだ?削除フラグが削除の代わりなんじゃないのか?
0845NAME IS NULL2015/10/06(火) 10:07:23.63ID:???
>>840
>>596のようなテーブルの場合、ユーザレコードをDELETEするとaccount_nameを表示できなくなってしまう。
では、Accountsの内容を、それを参照する全てのテーブルにコピーしておくかというと、大抵はそうはしない。
なぜなら、それは正規化に反するから。

この設計が問題であるとするなら、どう設計する?
0846NAME IS NULL2015/10/06(火) 10:08:23.34ID:???
まあ、>>596の場合は、外部キー参照があるので、Accountsのレコードだけを削除することはできないんだが。
0847NAME IS NULL2015/10/06(火) 10:15:28.45ID:???
ユーザ削除後も、削除前と同じようにTicketの表示ができるようにするための手段として、

・Accountsに削除フラグを追加
・Accountsに有効期限情報を追加
・Accounts_Archiveに削除されたユーザのレコードを移す
・削除されたユーザであることを示すAccounts_deletedテーブルを追加

などの実装手段があり、どれを選択しても「ユーザ削除後も、削除前と同じように
Ticketの表示ができるようにする」という要件は満たす。

「削除フラグ駄目絶対」な人は、このケースにおいても削除フラグ追加という実装手段は駄目だって
言ってる人が多いね。
0848NAME IS NULL2015/10/06(火) 11:52:00.44ID:???
あ、そうか、履歴テーブルに移動パターンだとFK制約が付けられないのか
0849NAME IS NULL2015/10/06(火) 12:26:07.11ID:???
>>845
>なぜなら、それは正規化に反するから。
データ発生時のAccountsの内容を保持するという要件なら正規化には反しないぞ
0850NAME IS NULL2015/10/06(火) 12:37:52.49ID:???
なんで特定の実装ありきで設計の話してんだよ
履歴を保持する必要があるのなら、現行のマスターに依存しないモデルを作れば良いだけだぞ。
0851NAME IS NULL2015/10/06(火) 13:13:18.52ID:???
>>849
> データ発生時のAccountsの内容を保持するという要件なら正規化には反しないぞ

微妙に異なる要件を入れないでくれよ。
誰も「データ発生時のAccountsの内容を保持する」とかいう話はしていない。
>>596のようなデータを管理するときに、BTSからユーザを削除するときの話。
0852NAME IS NULL2015/10/06(火) 13:14:52.53ID:???
>>850
> 履歴を保持する必要があるのなら、現行のマスターに依存しないモデルを作れば良いだけだぞ。

履歴を保持しなくて良いシステムと、履歴を保持するシステムにわけられるとき、
後者は同じ情報を至る所に持つテーブル設計にするのか?
0853NAME IS NULL2015/10/06(火) 13:24:00.14ID:???
ちなみに、AccountsとBugsの完全版は以下。(書籍SQLアンチパターンから引用)
Ticketを表示するとき、reporterd_by, assigned_to, verified_byしたユーザのportraitとnameが表示される。

さて、ユーザを削除できるのが前提の場合、どういう設計にするのが良いだろうか?

CREATE TABLE Accounts (
  account_id SERIAL PRIMARY KEY,
  account_name VARCHAR(20),
  first_name VARCHAR(20),
  last_name VARCHAR(20),
  email VARCHAR(100),
  password_hash CHAR(64),
  portrait_image BLOB,
  hourly_rate NUMERIC(9,2)
);

CREATE TABLE Bugs (
  bug_id SERIAL PRIMARY KEY,
  date_reported DATE NOT NULL,
  summary VARCHAR(80),
  description VARCHAR(1000),
  resolution VARCHAR(1000),
  reported_by BIGINT UNSIGNED NOT NULL,
  assigned_to BIGINT UNSIGNED,
  verified_by BIGINT UNSIGNED,
  status VARCHAR(20) NOT NULL DEFAULT 'NEW' ,
  priority VARCHAR(20),
  hours NUMERIC(9,2),
  FOREIGN KEY (reported_by) REFERENCES Accounts(account_id),
  FOREIGN KEY (assigned_to) REFERENCES Accounts(account_id),
  FOREIGN KEY (verified_by) REFERENCES Accounts(account_id),
  FOREIGN KEY (status) REFERENCES BugStatus(status)
);
0854NAME IS NULL2015/10/06(火) 13:29:27.95ID:???
>>849
いや、反するよ。

>>851
混ぜる必要のない要件であることは確かだが、反するってちゃんと言っとかないと後々面倒なことになると思う。
0855NAME IS NULL2015/10/06(火) 13:31:45.83ID:???
>>853
俺だったら、Accounts.delete_at DATEを追加するね
0856NAME IS NULL2015/10/06(火) 13:37:42.60ID:???
>>852
横だけど、後者は同じ情報に至るテーブルを作ってるケースをよく見るな。
ほぼ同じテーブルが複数あるのに違和感を感じるが
用途が違うって事で許容してるのかもしれない。
0857NAME IS NULL2015/10/06(火) 22:22:40.24ID:???
>>845
>>596のテーブルで、account_idもaccount_nameも残す必要があるのに
Accountsのレコードを削除するという問題設定がそもそも意味不明なんだが?
何がしたいんだ?
0858NAME IS NULL2015/10/07(水) 10:05:50.93ID:???
>>857
いやだから、BTSでユーザを削除するという要件を、どう設計/実装するかという話なんですけど。
0859NAME IS NULL2015/10/07(水) 10:37:17.60ID:???
>>857
いまさら何言ってるんだか。
0860NAME IS NULL2015/10/07(水) 12:33:50.62ID:???
>>858
ユーザーデータを削除するという要件なら
文字通り削除するしかないんだが
お前何に悩んでるの?
0861NAME IS NULL2015/10/07(水) 12:36:21.60ID:???
落ち着け。まず喧嘩腰で話すと言い合いになるだけだぞ。
相手の意見が間違っていると思うなら、論理的かつ冷静に諭せ
0862NAME IS NULL2015/10/07(水) 12:39:39.29ID:???
>>861
お前が落ち着けw
0863NAME IS NULL2015/10/07(水) 12:50:36.73ID:???
>>853
> ユーザを削除できるのが前提の場合
ユーザを削除した場合に何を残すのかという要件もセットで提示しないと。
0864NAME IS NULL2015/10/07(水) 12:54:25.16ID:???
>>863
BTSなんでTicket(Bugsレコード)は残さないといけないんですが、明示しないとわかんないですかね。
0865NAME IS NULL2015/10/07(水) 12:57:45.29ID:???
>>860
> ユーザーデータを削除するという要件なら
「ユーザーデータを削除する」じゃなくて、「ユーザーを削除する」が要件ね。

> 文字通り削除するしかないんだが
ユーザを削除するというのは要件(要求仕様)、それを設計/実装仕様ではどうするのって話。
0866NAME IS NULL2015/10/07(水) 13:09:21.49ID:???
BTSがなんだかわかんないんじゃないの?
0867NAME IS NULL2015/10/07(水) 13:23:35.25ID:???
@t_wadaは、Bugsテーブルに削除フラグを追加するのがどうだって話をしていたが、
Accountsに削除フラグを追加するのはどうかという話をして欲しかったね。
0868NAME IS NULL2015/10/07(水) 13:57:30.69ID:???
特定の要求に対する実装は、要求をはっきりさせないと話にならない
結局、要件次第といういつもの何の参考にもならない結論だな
0869NAME IS NULL2015/10/07(水) 14:02:04.40ID:???
要件次第だけど、大方決まってる道筋ってあるじゃん?
削除フラグの件で言えば、基本的には物理削除でおkなんだよ。
もうそれで要件の90%は満たされていると言っていい。

残りの1割ぐらいの人が「誰が削除したいか知りたい」とか”要件”を言い出すから、
そういう場合はその都度対応すればいいだけ。
0870NAME IS NULL2015/10/07(水) 14:25:11.87ID:???
あるネットゲームの場合、ユーザーの退会後一ヶ月以内なら、
復活を認めるって所があるな。
この場合は、物理削除するにしても一ヶ月間保留される。
レコードは移動してないと思う。
移動したら、復活がめんどくさいだろうね。
0871NAME IS NULL2015/10/07(水) 14:27:29.13ID:???
モバゲーなんてもろ削除フラグだな。物理削除もしてない。
だから何度でも復活できる。これはこれで嫌だなぁ
0872NAME IS NULL2015/10/07(水) 15:39:24.18ID:???
それはただの状態遷移でしょ
0873NAME IS NULL2015/10/07(水) 18:23:03.80ID:???
>>869
> 要件次第だけど、大方決まってる道筋ってあるじゃん?
なんでそういうのがあるってことにしたいんだろう?
そうしとかないと、何か安心しないとか?
0874NAME IS NULL2015/10/07(水) 18:50:12.87ID:???
>>865
お前が言ってるのはユーザーを削除する機能の仕様な。
例えばお前に渡された「ユーザー削除画面」の仕様が
ユーザーを削除しますがユーザーデータは参照出来るようにします
という代物だったら、そもそも上流が間違ってる。
お前が考えてどうにかなる問題じゃないぞ。
0875NAME IS NULL2015/10/07(水) 19:43:58.74ID:???
>>808
そもそも削除フラグよりも履歴の方が良いだなんて何時このスレでまとまったのか?
件のスライドショーは削除フラグの話と見せかけて
「お客の話聞いてないだけでした」というオチだったと記憶しているが
0876NAME IS NULL2015/10/07(水) 20:54:05.59ID:???
>>865
その「ユーザーの削除」が発生したときに、じゃあログインはもうしないからパスワードは消す、
アカウント名は履歴の表示に必要だから残すとか、そういった落とし込みまでできてなきゃ要求分析が
終わったとは言えんだろう。
なんかそのへんすっ飛ばしたまま「ユーザーの削除」=「ユーザーテーブルのレコード削除」という
考えから抜け出せていないから悩んでいるようにしか思えんが。
0877NAME IS NULL2015/10/07(水) 22:43:53.62ID:???
ユーザーを削除=ユーザーテーブルのレコード削除って思考が直結するのは
ユーザーを削除するっていう言い方が良くない気がするな

実際はユーザの利用を停止させるだけだったり、ユーザの登録情報の抹消だったり
そのユーザが関わった全ての痕跡の消去だったりするわけで
0878NAME IS NULL2015/10/08(木) 00:06:24.54ID:???
>>864
チケットさえ残ればいいのか?って話なんだが。
それなら外部制約はずしてユーザ削除すればいいだけだし。
0879NAME IS NULL2015/10/08(木) 06:49:38.95ID:???
>>878
普通に BTS 使ってたら起票した人の名前がないとかは色々まずいと思うと思うが?
そう言う常識もない様な奴はレスするなよ…
0880NAME IS NULL2015/10/08(木) 07:41:37.83ID:???
要件:「ユーザーを削除する。具体的にどうするかは自分で考えろ」てか?

BTSのチケットで個人を特定するのはIDでも本名でもなんでもいいだろ。そんな常識はない。
で、>>853のテーブルでAccountsのレコードだけ削除して問題があるのはBugsがAccountsの
account_idを外部キー参照しているから。
おそらくAccounts.account_idはAccountsレコードが存在しなければ意味を持たない人工キー
なんだと思うが、その場合はIDのマスタと個人に属する情報の管理テーブルとに分ければよい。
IDが自然キーなんであれば最初から問題はない。
0881NAME IS NULL2015/10/08(木) 08:39:27.34ID:???
「ユーザーを削除する。具体的にどうするかは自分で考えろ」

なら文字通り「レコードを削除する」で良いだろ。
なんかお前らはあれこれ理由つけて煽るからややこしくなる。

まずは物理削除の事を考え、それから要件に合わせて
論理削除を考えればいいだけだろ。
「物理も論理もあるし、それは要件次第だし〜」とか言い出すから
ややこしくなっているんだといい加減気づけ
0882NAME IS NULL2015/10/08(木) 10:29:08.14ID:???
まぁ、BTSのこと知らない奴と話しても無駄だね
0883NAME IS NULL2015/10/08(木) 10:30:16.84ID:???
>>880
BTSのこと知らないどころか、SERIALのことも知らない奴だったか
0884NAME IS NULL2015/10/08(木) 10:46:24.67ID:???
>>876
> ログインはもうしないからパスワードは消す
これは実装仕様だな。
削除されたユーザはログインできない、が要件。

> アカウント名は履歴の表示に必要だから残す
こっちは要件。

ただし、どちらもBTSでは「常識」。
0885NAME IS NULL2015/10/08(木) 10:59:26.86ID:???
・退会したユーザーはユーザーテーブルから削除する
・だが、誰がいつ削除したかの情報だけは残したい(DB上に履歴が残ればいい)

と言った場合ならどうするのが常識なの?
0886NAME IS NULL2015/10/08(木) 11:51:30.70ID:???
>>885
いい加減、実装仕様と要求仕様の違いを認識してくれよ。

> ・退会したユーザーはユーザーテーブルから削除する
これは実装仕様。

> ・だが、誰がいつ削除したかの情報だけは残したい
これは要求仕様。

「誰がいつ削除したかの情報だけは残したい」という要件を満たすために、
・ユーザーテーブルから削除する
・「誰がいつ削除したかの情報」テーブルを追加する
という設計にする。

なお、ユーザーテーブルから削除しない「論理削除」という実装方法もある。

どっちかというと、前者の方法がとられることが多い(個人的観測)。
0887NAME IS NULL2015/10/08(木) 12:37:37.91ID:???
なんだよユーザ名残さないといけないのかよ。
そんな隠し要件あるなら、
ユーザテーブル(ユーザ名を含み、ユーザ削除時に削除しない)
ユーザ属性テーブル(ユーザ名以外の情報。認証情報やらなにやら。ユーザ削除時に削除する)
ってしなきゃいけないな。
0888NAME IS NULL2015/10/08(木) 12:41:24.45ID:???
なんらかの情報を残さなければいけないのなら、それはユーザーの削除ではない。
要件定義の時点でそこを間違うから、憐れな混乱したプログラマが後を断たないんだな。
0889NAME IS NULL2015/10/08(木) 13:08:24.40ID:???
お前の言う削除は削除ではないって、ブログで誰かが言ってたな
0890NAME IS NULL2015/10/08(木) 13:11:21.15ID:???
まあ、BTSでユーザが「削除」されたときの要件は、それこそBTSごとに違ってて、
「削除」とそのユーザが表示されたところが全部anonumousになるってのもある。

つまり、要件次第。
0891NAME IS NULL2015/10/08(木) 13:53:12.56ID:???
分からん。お前らの言うことは分からん
0892NAME IS NULL2015/10/08(木) 14:03:13.46ID:???
俺が思う要求は、だまってても当然実装されるべき要件にきまってるだろ

こう思ってるユーザは多いんだが、開発者側にもこう思ってるやつがいたとは
0893NAME IS NULL2015/10/08(木) 14:10:13.94ID:???
>>888
それこそ、(ユーザの)削除という用語の定義の問題
ちゃんと用語定義してない言葉を使うから、きちんと意思の疎通ができない
0894NAME IS NULL2015/10/08(木) 15:32:44.00ID:???
なんか削除フラグの議論してる奴らって、アスペっぽい奴が多いな
0895NAME IS NULL2015/10/08(木) 15:43:19.54ID:???
無駄話なんだから、NGに登録しとけば
0896NAME IS NULL2015/10/08(木) 16:42:06.07ID:???
>>892
逆じゃね?ユーザ(てか依頼者)側が思ってるから、
開発者側もそれに従うしか無いんだろ。1から10まで説明求めると嫌がるんだし。
0897NAME IS NULL2015/10/08(木) 17:11:07.38ID:???
Redmineだと、ユーザを削除すると、関連データにはanonymousと表示されるらしい。
>>890が言ってるのかこれかな?
で、複数人削除すると、anonymousが氾濫してカオスになるとか。
じゃRedmineはどうしてるかというと、上で言っている「削除」は、「ユーザをロックする」という機能で実現してる。
0898NAME IS NULL2015/10/08(木) 17:18:13.39ID:???
>>897
別にカオスにはならないよ。このスレ、名前共通、ID非表示でしょ。
0899NAME IS NULL2015/10/08(木) 17:45:02.23ID:???
業務で管理するデータの何パーセントかがつぎつぎに匿名に置き換わっていってもいいってことなら、
それは価値観が違うとしか言えない。
0900NAME IS NULL2015/10/08(木) 19:14:57.30ID:???
「価値観の違いによりその件は要件として認められません」
なんだそれ?
0901NAME IS NULL2015/10/08(木) 23:57:27.33ID:???
>>899
何を問題視してるのか明示しないあたりがもうダメダメだと思うんだけどさ、
もしも匿名ユーザの区別がつかないことが問題だと考えてるなら退会ユーザ1 2 3 って名前挿げ替えればいいじゃん。
個人情報保護の目的で削除してくれっていわれても残しちゃう系なの?
0902NAME IS NULL2015/10/09(金) 03:31:44.52ID:???
この流れ、そもそも何の話してたんだ?
0903NAME IS NULL2015/10/09(金) 06:45:52.32ID:???
>>901
何を問題視してるのか理解してないあたりがもうダメダメだと思うんだけどさ…
業務システム知らないならいちいち絡んで来るなよ
0904NAME IS NULL2015/10/09(金) 07:12:17.08ID:???
>>853あたりで設計の方法論を議論したかったようなんだが、設問自体にいろいろ突っ込まれて
しまいには「BTSの常識」で考えろとか言い出した。
0905NAME IS NULL2015/10/09(金) 07:28:08.60ID:???
常識指向モデリングw
0906NAME IS NULL2015/10/09(金) 07:47:31.08ID:???
いや、笑うところじゃないだろ
常識(デファクトスタンダード)知らないと、個々の開発者で違ったものが出来るだろ
0907NAME IS NULL2015/10/09(金) 08:23:50.39ID:???
まずは個々人の考える「常識」が必ずしも一致しないってことから理解しような。
だからこそ要件定義や議論の前提なんかではそれに依存しないようにすることが必要なわけで。

唯一の正しい「常識」が存在して、それと異なる考えを持つ人は「常識を知らない人」と
考えちゃうのはアレだ。小児期にみられる、自己と世界の区別が確立していないやつ。
0908NAME IS NULL2015/10/09(金) 10:07:09.06ID:???
>>907
だから、一致させようって話だろうが。
お前頭固すぎだな。我も強いし、協調性0かよ
0909NAME IS NULL2015/10/09(金) 11:10:26.74ID:???
>>904
さすがに、BTSでユーザを削除したら、そのユーザが起こしたチケットも削除されてもいいとか思ってるなら
常識無しと言われてもしかたがない。
0910NAME IS NULL2015/10/09(金) 11:50:53.16ID:???
ところで、この話を持ちだした808(だと思うけど)、いい加減この話題をどうしたいのか顔出せよ
0911NAME IS NULL2015/10/09(金) 12:09:05.93ID:???
>>903
対案も出してるし、聞いてることには答えないし、むしろ業務システム知らないんじゃないの?
0912NAME IS NULL2015/10/09(金) 13:11:35.67ID:???
>>901
> 何を問題視してるのか明示しないあたりがもうダメダメだと思うんだけどさ、
なんだろう、この無力感。

「業務で管理するデータの何パーセントかがつぎつぎに匿名に置き換わってい」くって書いてるじゃん。
俺がそれを問題だと思ってると読めないのか?
0913NAME IS NULL2015/10/09(金) 13:12:35.77ID:???
あー、

>>901
> 個人情報保護の目的で削除してくれっていわれても残しちゃう系なの?

俺がBTSについて話してるのが理解できてないみたいだな。
0914NAME IS NULL2015/10/09(金) 13:32:59.21ID:???
今北産業
0915NAME IS NULL2015/10/09(金) 14:09:39.29ID:???
>>910
みんなでトコトン話し合おう
0916NAME IS NULL2015/10/09(金) 14:10:21.10ID:???
>>912
匿名に変わって困るような、業務上生きてるデータって誰かに引き継がれるだろ
0917NAME IS NULL2015/10/09(金) 14:30:06.11ID:???
要件定義なんて、常識の確認が半分なんだが
理由を聞かれて、常識だろって説明する奴は信用ならん
0918NAME IS NULL2015/10/09(金) 14:53:08.87ID:???
誰が聞いてくるかによるな。
クライアントなら丁寧に説明するが、同僚なら「常識だろ」って言いたくなる。
0919NAME IS NULL2015/10/09(金) 18:54:46.38ID:???
100歩譲ってBTSでユーザー名が表示されなくなってはいけない事が常識だとしても
それが削除フラグの話題とは何の関連もない件
0920NAME IS NULL2015/10/09(金) 20:44:53.63ID:???
BTSにおいて大事なのはチケットの状態がどうなってるかであって、
誰が起票したとかは業務遂行上はどうでもいいことというのが、通常の開発者が持ってる常識だと思うよ。
0921NAME IS NULL2015/10/09(金) 21:34:36.05ID:???
アンチパターン幻の第27章 常識だろ
0922NAME IS NULL2015/10/09(金) 22:01:56.69ID:???
>>911
役に立たない戯れ言を対案って言われてもね w

>>920
BTSで人の情報は結構重要だよ
少し大き目のプロジェクトで開発管理したことないだろ
0923NAME IS NULL2015/10/09(金) 23:03:20.50ID:???
>>922
いやお前は開発した事ないだろw
0924NAME IS NULL2015/10/09(金) 23:28:16.30ID:???
>>908
それを「常識だろ」で片付けていたらいつまでも一致するわけがないわな。
0925NAME IS NULL2015/10/10(土) 00:42:49.47ID:???
>>922
少し大き目ってどの程度を指してんのか知らんが、
誰がっていうのを意識できる程度の規模に収まってる現場かなって思えてしまうよ。
人の情報、どう使ってんの?話の流れに沿わせるとすでに現場にはいない人の情報。
0926NAME IS NULL2015/10/10(土) 00:47:44.65ID:???
連投すまんが、これもう釣りじゃないかって思えてきた。
・常識だろ
・そんなの話にならない
・価値観が違う
・BTS知らないんじゃないの?
・いろいろまずいだろ
0927NAME IS NULL2015/10/10(土) 06:16:42.38ID:???
釣りじゃないかと思えてきた=他人を一切認められない

つまりお前は狭量ってことだ。
他の奴は他人の意見を踏まえた上でレスしてる
0928NAME IS NULL2015/10/10(土) 09:56:40.70ID:???
>>926
相手を分かろうとしない、自分が絶対なレスばっかりだな
0929NAME IS NULL2015/10/10(土) 11:31:08.78ID:???
>>923
そう言う悔し紛れのレスしかできないならおとなしくROMっとけよ…

>>925
そいつが書いた設計資料を見たいとかないのか?
構成管理が完璧で資料も完全に紐付けられてるなら良いのかもしれないけど
0930NAME IS NULL2015/10/10(土) 13:19:28.89ID:CZUC3EIR
【税金泥棒】 大阪維新の会 小林よしか 黒瀬大
https://youtu.be/yZG2-L5H-Yk
https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%83%94%E3%83%AD%E3%83%BC%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF 
堺市の小林由佳って、上西以上の感じ悪さだな。
こういうのどんどん放映して、維新の悪を暴いてほしい
0931NAME IS NULL2015/10/10(土) 13:23:53.94ID:???
>>909
もともとユーザーを削除する話だし、チケットを削除するなんて誰も言ってないと思うが。

もしかして、「ユーザーテーブルのレコードを削除する」→「それを外部キー参照する
レコードは存在し得ない」ってところで思考停止してんのかね?
0932NAME IS NULL2015/10/10(土) 13:48:46.64ID:???
>>929
いやだからw悔しくて仕方がないのはお前だろw
0933NAME IS NULL2015/10/10(土) 19:52:53.87ID:???
>>929
設計資料?BTSの話だよね?
0934NAME IS NULL2015/10/10(土) 20:09:55.86ID:???
>>933
そうだよ
設計書の修正管理を BTS でやるのは珍しくないし、ある不具合を作り込んだ奴が他に変な設計してないか確認したいこともあるだろ
>>932 みたいに設計が何をするのか理解してないアホじゃないならわかると思うけど w
0935NAME IS NULL2015/10/10(土) 20:39:45.45ID:???
いい加減スレ違いの話題にうんざりだが、最後にこれだけ言わせてくれ。

>>934
> ある不具合を作り込んだ奴が他に変な設計してないか確認したいこともあるだろ
そういうのはレビューでやるもんだ。

お前本当に開発した事ないだろ。
0936NAME IS NULL2015/10/10(土) 20:43:48.38ID:???
削除フラグはNGワードにすべきだな
0937NAME IS NULL2015/10/10(土) 20:46:13.41ID:???
チケットがassignされるのは在籍中だろうが、そのときに確認せずに辞めてから確認するのか?
まぁ、無いとは言えんがそんなのが頻発するようなら管理方法見直せ。なんのためにBTS使ってんだか。
0938NAME IS NULL2015/10/10(土) 20:47:32.26ID:???
>>934
言いたいことは分かるが、そこまで人依存しちゃってる現場って長らく経験してないな。
でもまぁ、そうやって人名に依存したい(そしてそれが価値のある体制)のなら
ユーザ削除時にも名前は残すようなDB設計にしないといけないだろうなと思うよ。
どの人がどの設計書を書いたのかってのがとても重要そう。
09399382015/10/10(土) 20:49:14.06ID:???
ちょ、人の多さにびっくりした
0940NAME IS NULL2015/10/10(土) 20:51:09.93ID:???
>>935
> そういうのはレビューでやるもんだ。

どこまでアホなんだよ…
レビューするための設計書をどうやって見つけるかって話で、確認の方法なんて言ってないぞ

> お前本当に開発した事ないだろ。

開発云々以前に頭が設計に向いてないんだろうな w
0941NAME IS NULL2015/10/10(土) 20:58:09.28ID:???
>>937
まあ業種にも依るだろうけどうちだと保守とかで15年以上前のコードがあったりするし
0942NAME IS NULL2015/10/10(土) 20:59:16.52ID:???
>>940
あなたのいうレビューと>>935のいうレビューは違うものだと思う。
そして>>935の方が一般的な開発現場で使われているものだ。
0943NAME IS NULL2015/10/10(土) 21:00:29.66ID:???
>>941
別に15年だろうが20年前だろうがあっても問題ないでしょ。
15年前に起票されたチケットがクローズされずに残ってるわけじゃないんでしょ?
0944NAME IS NULL2015/10/10(土) 21:10:53.14ID:???
>>941
元の担当者がいなくなった古いコードなんてのはどこにでもあるだろうけど、>>934みたいな
属人的な確認を後からやるなんてのはめったにあるもんじゃないな。
0945NAME IS NULL2015/10/10(土) 21:24:43.69ID:???
BTSのチケットの担当者ってそれを処理する担当ってだけで、べつにその原因を作った奴と
同一人物とも限らんよな。
0946NAME IS NULL2015/10/10(土) 21:35:01.59ID:???
>>942
だからレビューの話なんてしてない
指摘されてもわからんとか終わってるな
0947NAME IS NULL2015/10/10(土) 21:42:58.51ID:???
>>943ー944
まあ毎日あるとは言わない
滅多にないと言う方が正しいけど何回かあったのも事実
あと外注さんが設計してシステムテストの前にいなくなると言うのもあったりするし

>>945
うちは原因を作り込んだ人の名前も入れてる
0948NAME IS NULL2015/10/10(土) 21:45:04.90ID:???
>>946
あなたの現場では違うんだろうけど、規模が大きければ大きいほど、レビューでやるもんだよ。
0949NAME IS NULL2015/10/10(土) 21:46:11.76ID:???
>>947
原因を作りこんだ人の名前を入れてるならユーザ削除されても問題ないんじゃないの。
0950NAME IS NULL2015/10/10(土) 22:05:26.85ID:???
>>948
バカの上に粘着かよ…
0951NAME IS NULL2015/10/10(土) 22:07:56.06ID:???
>>949
作り込んだ人の名前もユーザーテーブルから引いてる場合の話だろ
見たら「匿名123」とか表示されてても困るとは思う
0952NAME IS NULL2015/10/10(土) 22:10:14.70ID:???
>>950
おい>>948は俺じゃないぞw
もう諦めろw
0953NAME IS NULL2015/10/10(土) 22:16:52.40ID:???
>>951
上で何度も言われている通り、それが要件ならユーザー削除でレコードが削除される
テーブルに入れなきゃいいだけ。
0954NAME IS NULL2015/10/10(土) 22:32:58.38ID:???
>>952
お前が誰かは知らんけどいつまでもレビューって言い続けてる奴は粘着質だろ
0955NAME IS NULL2015/10/10(土) 22:35:09.61ID:???
>>953
そう言うのは >>901 辺りに言ってくれ
0956NAME IS NULL2015/10/10(土) 22:44:46.95ID:???
「それが要件なら」ってのと「そんな要件は必要ない」ってのは別に矛盾しない。
0957NAME IS NULL2015/10/10(土) 22:49:51.24ID:???
開発者「そんな要件は必要ない」
客「は?」
0958NAME IS NULL2015/10/10(土) 22:51:43.79ID:???
>>951
外注のAさんが原因を作りこみました。
外注のAさんが設計したのはこれらです。

で、Aさんが匿名1に変わって何が問題なの?
0959NAME IS NULL2015/10/10(土) 22:58:23.22ID:???
>>957
客「それが要件なら」
開発者「は?」
0960NAME IS NULL2015/10/10(土) 23:07:19.40ID:???
>>958
> で、Aさんが匿名1に変わって

の状態でどうやって

> 外注のAさんが設計したのはこれらです。

って言うのさ

Aさんがいなくなる時にAさんが作成した全てのドキュメントの作成者を匿名1に書き換えるのか?
0961NAME IS NULL2015/10/10(土) 23:14:10.57ID:???
>>960
だからそんな「BTSの常識」から外れた運用するんでなけりゃ問題ない。
0962NAME IS NULL2015/10/10(土) 23:33:56.66ID:???
>>960
設計書もBTSのユーザに紐付けた形で管理してるって話だったんじゃ?
修正者は残すが作者は残ってないっていう状態なのかな。
0963NAME IS NULL2015/10/10(土) 23:35:02.20ID:???
>>961
外れてることにしないと自我が保てないの?
0964NAME IS NULL2015/10/10(土) 23:39:04.95ID:???
そもそもBTSに登録する時はどこから調べあげるんだろうか
0965NAME IS NULL2015/10/10(土) 23:39:24.15ID:???
>>963
メジャーなBTSでチケットにバグの原因者を入力させるようなのがどれだけ存在する?
0966NAME IS NULL2015/10/10(土) 23:39:35.76ID:???
>>962
だから >>929 にも書いたけど現状では完全には紐づけできてないってこと
できてりゃいいのかも知れない
0967NAME IS NULL2015/10/10(土) 23:39:50.57ID:???
設計書の修正をBTSで管理する。
チケットに不具合を埋め込んだユーザも持たせる運用にする。
だが、設計書の作者とBTSのユーザマスタとは連携していない。

ということ?
0968NAME IS NULL2015/10/10(土) 23:45:29.29ID:???
>>966
じゃあ、設計書はBTSで管理できてないっていうのと同じだ。
BTSで管理するならVCSとも連携してるだろうし、そっちのリビジョン番号書いとくほうが便利そうな気がしない?
0969NAME IS NULL2015/10/10(土) 23:50:00.55ID:???
「常識で考えろ」とかごまかしても、結局「要件は何だ?」ってところに戻るんだよな。
0970NAME IS NULL2015/10/10(土) 23:58:42.37ID:???
>>965
この場合、むしろBTS名聞いたほうがはやい。
一般的なBTSの常識だろっていわれたらひっくり返るしかない。
0971NAME IS NULL2015/10/11(日) 00:13:14.25ID:???
>>967-968
そう、残念ながらできてない
少しずつはやってるけど、設計書とかはワード・エクセルで作成されることが多いのでマージできないのが辛い

>>970
Redmine の項目に作り込んだ人の名前を追加してるだけだが珍しいのか?
0972NAME IS NULL2015/10/11(日) 00:18:21.83ID:???
>>971
設計書が生まれた時点で、適当なチケット起こして名前入れてクローズしとけば?
0973NAME IS NULL2015/10/11(日) 00:32:01.72ID:???
作りこんだ人の名前をプレーンな形で入れておけば
ユーザマスタからはユーザを削除しても問題ないってことにはならないのだろうか。

なんでDB設計スレで運用レイヤ視点で話さないといけないのかモヤモヤするけど、
そうしないと伝わらない感が強い。
0974NAME IS NULL2015/10/11(日) 00:33:31.47ID:???
>>972
VCS との連動まではできてるからコードはそうやってる
ドキュメントも同じようにすればいいんだけど、なかなか運用に載せられない
0975NAME IS NULL2015/10/11(日) 00:38:04.25ID:???
>>973
俺はそれでいいと思うけど、納得しない人がいるってだけでしょ
0976NAME IS NULL2015/10/11(日) 00:47:47.97ID:???
>>973
設計スレなんだから、「そうしたければそう設計する」でいいと思う。
0977NAME IS NULL2015/10/11(日) 00:52:54.30ID:???
BTSやVCS導入直後に陥りがちな悩み相談スレかな?
0978NAME IS NULL2015/10/11(日) 01:04:27.65ID:???
例として出した事例に難癖つけるいつもの展開って奴でしょ
0979NAME IS NULL2015/10/11(日) 01:32:58.02ID:???
事例ってどれだ。
0980NAME IS NULL2015/10/11(日) 01:48:07.95ID:???
いいかげんにBTSスレでも立ててそっちでやってくれ
0981NAME IS NULL2015/10/12(月) 15:22:21.22ID:???
自演だったんだなぁ…
0982NAME IS NULL2015/10/13(火) 10:21:40.93ID:???
>>938
> 言いたいことは分かるが、そこまで人依存しちゃってる現場って長らく経験してないな。
普通に考えて、俺が登録したなにがしかの情報を、誰だかわかんない奴に修正されても困る。
0983NAME IS NULL2015/10/13(火) 10:26:06.78ID:???
普通に考えて、そういう現場は間違っている
個人営業の企業くらいだろ、そんなこと平気でするのは
0984NAME IS NULL2015/10/13(火) 10:34:45.77ID:???
DB設計の話しろよ
0985NAME IS NULL2015/10/13(火) 14:26:58.48ID:???
で、要件次第以外で削除フラグの代替はどうなるのよ?
履歴テーブル使うのでFAか?
0986NAME IS NULL2015/10/13(火) 14:34:08.32ID:???
そんなの、どういう意図で削除フラグを使おうと思ったのかによるだろ

つまり、要件次第
0987NAME IS NULL2015/10/13(火) 14:37:25.25ID:???
でたーーーー要件次第で考えるのやめちゃう奴ーーーー
0988NAME IS NULL2015/10/13(火) 14:40:52.88ID:???
そもそも削除フラグの代替って点でもうずれてる

無効になるかもしれない何らかの情報があるときどう設計すべきか、って話
・無効になるとはどういう事か
・無効になった情報と、その関連情報はどうするべきか
最低この2点は決定しないと話にならん
0989NAME IS NULL2015/10/13(火) 14:46:02.54ID:???
一時的に無効にするっていうのもあるだろう
アカウント停止措置なんかで
0990NAME IS NULL2015/10/13(火) 16:41:38.79ID:???
また要件も決めずにオレオレ実装サイコーってやり合うのかよ
バカすぎ、考えるのやめちゃう奴の方がマシ
0991NAME IS NULL2015/10/13(火) 16:49:53.97ID:???
>>987
どうすべきかを判断できるだけの要件を考えることをやめる奴よりはまし
0992NAME IS NULL2015/10/13(火) 17:09:57.44ID:???
>>990
俺が思う要件は常識だろって奴もいるぞ
0993NAME IS NULL2015/10/13(火) 17:20:50.28ID:???
削除フラグでググると、アホ記事しかヒットしないんだが、これをアホだと思う俺の方がおかしいのかもとも思う

http://qiita.com/Jxck_/items/156d0a231c6968f2a474
http://fujiiyuuki.blogspot.jp/2010/05/blog-post.html
http://ledsun.hatenablog.com/entry/2015/03/27/015203
http://mike-neck.hatenadiary.com/entry/2015/03/24/231422
0994NAME IS NULL2015/10/13(火) 17:38:12.72ID:???
次スレから、削除フラグの話禁止
0995NAME IS NULL2015/10/13(火) 17:43:13.27ID:???
>>993
いつも思うが、他人をアホだと思うなら、何ならアホと思わないのか代替案を言えよ。
批判するだけなら誰でも出来る
0996NAME IS NULL2015/10/13(火) 17:50:34.57ID:???
>>995
だーかーらー

よーうーけーんーしーだーいー
0997NAME IS NULL2015/10/13(火) 17:58:33.91ID:???
どういう意味でアホか書いてない(or書けないor伏せてる)あたり、逃げを打ってるようにしか見えないよね。
0998NAME IS NULL2015/10/13(火) 18:04:14.48ID:???
>>992
BTS とかに限定すりゃそれなりに常識ってものがあると思うが、社内システムとかだと色々ありすぎ
0999NAME IS NULL2015/10/13(火) 18:04:15.76ID:???
要件次第といいながら自分の意見を伝えない男が釣るスレ。
1000NAME IS NULL2015/10/13(火) 18:23:45.54ID:???
>>997
要件次第なのに、一般論で削除フラグは悪というのがアホ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
レス数が1000を超えています。これ以上書き込みはできません。