DB設計を語るスレ 7

このエントリーをはてなブックマークに追加
1NAME IS NULL
2NAME IS NULL:2013/12/06(金) 15:53:09.09 ID:???
関連スレ

何故データベース設計は軽視されるのか?
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/
3NAME IS NULL:2013/12/06(金) 15:53:10.26 ID:???
>>1
4NAME IS NULL:2013/12/06(金) 18:51:30.97 ID:???
>>1
Redmineのmembers禁止
5NAME IS NULL:2013/12/06(金) 19:01:36.51 ID:???
数人のわからずやのためにどれだけレスが消費されたか分からんからな。
禁止でいいと思うわ。
6NAME IS NULL:2013/12/06(金) 19:05:27.11 ID:???
Junction Tableって属性や関連もってもいいの?

これがずっと疑問でさ
7NAME IS NULL:2013/12/06(金) 19:20:50.54 ID:???
>>6
それこそ狭義と広義かと
8NAME IS NULL:2013/12/06(金) 21:32:49.66 ID:???
>>6
個人的には属性を持てると思う
Wikipediaの解説では、分かりやすい例として最も単純な
外部キーだけの構成で記述してあるだけで、
属性を持ってはいけない、あるいは持つべきであるとは書かれていない
 http://en.wikipedia.org/wiki/Junction_table

この解釈により、WikipediaのERモデルの解説中にある
ER図例における relatioship は、すべて junction table として実装できる
 http://en.wikipedia.org/wiki/Entity-relationship_model
 http://ja.wikipedia.org/wiki/実体関連モデル

判断に迷うのは、サロゲートキーを持てるかどうかという話
そもそも junction table では外部キーのタプルが主キーであるから、
サロゲートキーの追加はDB設計上の重複 or 歪みでしかない
9NAME IS NULL:2013/12/06(金) 21:41:30.47 ID:???
>>8を訂正
X: 属性を持ってはいけない、あるいは持つべきであるとは書かれていない
O: 属性を持ってはいけない、あるいは持つべきではないとは書かれていない
10NAME IS NULL:2013/12/06(金) 22:16:23.45 ID:???
前スレ>>995で以下の質問があったのでレスする
>> たまたまあるエンティティが2つの外部キーを持ち、
>>そのエンティティを介して2つのエンティティがm:n関係
>の具体例があったら上げて欲しい。「出版」みたいなわけわからん奴じゃなくて。

エンティティ顧客(customer)と製品(product)があり、第三の要素として受注(order)がある
order は、ある顧客からある製品を受注したという事象(event)を表現している
また属性として受注日付/受注個数等の受注に付随する属性、主キーとして受注番号、
そして外部キーとして顧客および製品への1:n関係を表現する顧客番号と製品コードを持つ

ここでERモデル設計上では、order は受注という事象を表現するエンティティである
なおかつ、結果としてorder を介し customer と product はm:n関係がある
11NAME IS NULL:2013/12/07(土) 04:15:21.33 ID:???
>>8
だからサロゲートキーはつけてもいいって。
wikipediaに頼るんなら、書いてあることぐらい理解しようよ。

>>10
それはたまたまじゃない。持つべくして持ってるよね。
12NAME IS NULL:2013/12/07(土) 11:56:34.44 ID:???
>>11
Associative Entity以外のどこに書いてある?
13NAME IS NULL:2013/12/07(土) 12:01:38.01 ID:???
>>8
サロゲートキーを持ってはいけない、あるいは持つべきではないとは書かれていない
14NAME IS NULL:2013/12/07(土) 17:49:17.18 ID:???
サロゲートキーを持てるかどうかじゃなくて
そのサロゲートキーが有用な場面は、って話だったはずなんだが
どんだけループしてんの
15NAME IS NULL:2013/12/07(土) 17:57:22.88 ID:???
持ってはいけないから、有用な場面を検討する必要は無い
vs
持っていいけど、その構成だと意味が無いから不要

かなぁ。
168:2013/12/07(土) 18:22:28.70 ID:???
・サロゲートキーは便利だから積極的に使おう(推奨派)
    vs.
・サロゲートキーはそれが必要なケースに限って使うべき(制限派)

ではないかと思われ


自分は後者の制限派
たとえば>>10の例だと、企業間取引であれば多くは受注伝票上の受注番号が
自然キーになるからサロゲートキーは使うべきではないけど、
これが(オンラインショッピングのような)個人取引であれば
受注番号は人工キーをサロゲートキーにせざるをえない、と考える

そしてRailsは前者の推奨派であり、
(属性を持たないm:n関係を除く)あらゆるテーブルはサロゲートキー id を持つ
17NAME IS NULL:2013/12/07(土) 18:31:02.82 ID:???
ここいらで、長く続くサロゲートキー論争の発端となった前スレ476のカキコをコピペしておく

476 名前: NAME IS NULL Mail: sage 投稿日: 2013/11/13(水) 22:40:49.61 ID: ???
すみません、ちょっと相談です。
どこからも参照されないような、意味のないサロゲートキーは張るべきではないって指摘したら
全てのテーブルにサロゲートキー張るのが定石ですよ!って返事が来た。
そんな定石は聞いたことないし、むしろ何でもID(IDリクワイアド)って世間一般的には否定されてなかったっけ?

テーブルA
[ID(サロゲートキー)]
[Part Number]

テーブルB
[ID(サロゲートキー)]
[Product Name]

テーブルC
A.[ID]
B.[ID]

CがA,Bの組み合わせでユニークなとき、Cにサロゲートキーを持つ意味って何なんでしょう?
複合キーはバグの温床でそれを排除できる。 将来の変更に柔軟に対応できる。
といわれても意味が分からない。このケースにおいて複合キーにバグの温床となる要素があるんだろうか…?
今後のテーブル構造の変更に柔軟に対応できる要素があるんだろうか…?
いったいどんな変更を想定しているんだろうか…?
18NAME IS NULL:2013/12/07(土) 18:50:25.23 ID:???
>>17
持つ意味は無い。
将来的に必要になったときに持てばいい。
19NAME IS NULL:2013/12/07(土) 18:57:34.02 ID:???
>>16
> 受注番号は人工キーをサロゲートキーにせざるをえない
??
20NAME IS NULL:2013/12/07(土) 21:29:40.21 ID:???
>>11
>それはたまたまじゃない。持つべくして持ってるよね。

そうだよね

ではここまではいいとして、次に、ある顧客との間で成立した
特定製品の値引きに関する契約が要求仕様に追加されたと仮定する
この場合ERモデルに対して、、たとえばエンティティ:顧客と製品との間に
リレーションシップ:取引条件(customer_product)を追加するという設計変更を行う
customer_product は、属性として値引率を持つ
そして、これまで設計してきたこのERモデルについて:
・チェンの記法(>>8 のWikipedia解説)によるER図と
・associative entity 用いたER図と
を見比べてみよう
 http://www.h6.dion.ne.jp/~machan/misc/associative-entity.png

この質問(>>10 の前スレ995)は、assocative entity に関する議論のなかで起きた

チェン記法ではエンティティ/リレーションシップがERモデル設計の意図に沿って
正確に作図できているのに対して、associative entity を用いた作図では
それらの分類を表現しない(or 表現できない)ことが分かるのではないだろうか?
21NAME IS NULL:2013/12/07(土) 22:57:13.39 ID:???
>>20
なんかまた話がずれたな。
で、自分でER図は書いてみた?
論理と物理
22NAME IS NULL:2013/12/08(日) 00:08:29.06 ID:???
>>21
概念ERモデル図は>>20で書いてあるだろ
ここまで単純なモデルであれば、
よほどの初学者でも無い限り、誰でも論理ER図は書けるはず
それとも>>21は書けないのかな?
もし書けるというのなら、論理/物理設計を話題にしたい>>21が、
実際に書いてみればいいんジャマイカと思われ

それから、物理ERモデル設計は制約やインデックス等を定義するものだから、
(ER図としてではなく)表形式のテーブル設計書として書いているよ
それとも、普段>>21は物理ER図を書いているの?
わざわざ物理ER図を書くという発想がピンとこないなあ....
ひょっとして>>21は(業務経験の無い)学生さんかな?
23NAME IS NULL:2013/12/08(日) 00:40:49.31 ID:???
何の話してんの?サロゲートキーなんてもうどうでもいいのかな。
連関エンティティはサロゲートキーを持ちうるかどうかから離れてってない?
どうせ長文書くなら結論まで頼む。
24NAME IS NULL:2013/12/08(日) 01:15:19.92 ID:???
>>23
もともとは(概念設計レベルではなく)論理設計レベルの質問(>>17)なんだから、

X: associative entity はサロゲートキーを持ちうるかどうか
O: junction table はサロゲートキーを持ちうるかどうか

じゃねえの?
25NAME IS NULL:2013/12/08(日) 01:23:32.88 ID:???
自演…
26NAME IS NULL:2013/12/09(月) 13:28:31.71 ID:???
>>20
その2個のER図を比べている意味がわからない。内容もおかしいし

第一チェンが使ってたAssociative Entityがなんで別の概念なんだ?
27NAME IS NULL:2013/12/09(月) 13:35:28.68 ID:???
>>10
前スレ>>995では一部省略したけど、

> ・たまたまあるエンティティが2つの外部キーを持ち、
>  そのエンティティを介して2つのエンティティがm:n関係にあったとしても、
> 設計者がそのエンティティを連関エンティティであると宣言していなければ
> (=設計者が意図していなければ/見落としていれば)、そのエンティティは連関エンティティではない

を受けて、「たまたまあるエンティティが二つの外部キーを持ち、なおかつ形態としては連関エンティティに
見えるが、設計者が意図していない、または、見落としているようなエンティティの例があったらあげてくれ」
という趣旨の質問。

で、>>10のorderは、連関エンティティと同じ形態であるためには、(customer_id, product_id)がユニークで
ある必要があるけど、そうなの?
28NAME IS NULL:2013/12/09(月) 13:47:37.45 ID:???
うーん、その後の議論は全くもって意味不明だな。
何を主張したいのやら。
29NAME IS NULL:2013/12/09(月) 13:50:36.03 ID:???
WikipediaのAssosiative Entityのページにあった図、あれって連関エンティティがrelationでもありentityでもある
といういみで、長方形と菱形を重ねただけかと思ったんだが違うのか?
30NAME IS NULL:2013/12/09(月) 14:54:37.72 ID:???
連関エンティティも交差テーブルも、使用するFWの都合等でサロゲートキーを持っても良い、って前スレで結論出たんじゃないのか?
31NAME IS NULL:2013/12/09(月) 15:11:19.15 ID:???
>>30
連関エンティティだけ
32NAME IS NULL:2013/12/09(月) 15:14:58.73 ID:???
>>31
は?何で持っちゃ駄目なんだ?
33NAME IS NULL:2013/12/09(月) 15:18:02.14 ID:???
>>7
この人も意味わからんわ
34NAME IS NULL:2013/12/09(月) 15:47:07.60 ID:???
>>22
> わざわざ物理ER図を書くという発想がピンとこないなあ....

え?書くよ?
逆に、物理ER図を書かない現場を知らないわ。
35NAME IS NULL:2013/12/09(月) 16:04:31.85 ID:???
Rails禁止。
36NAME IS NULL:2013/12/09(月) 16:24:11.82 ID:???
>>32
結論出たのが連関エンティティだけ
37NAME IS NULL:2013/12/09(月) 16:27:23.99 ID:???
>>33
Junction Tableで定義されてるのは、FKをまとめたPKのみ
これが狭義だろ
広義はしらね

Associative Entityは狭義も広義もなく
属性や関係を持ったりサロゲートキーを持つ話も定義されてる
38NAME IS NULL:2013/12/09(月) 19:12:38.98 ID:KDrt2ZmL
たとえば男女関係のように、多対多につながってるものを
表現する手法を教えてください。 ホモとレズはいません。

AさんはB子とC子とつきあっている
DさんはC子とD子とE子とつきあっている
FさんはB子とC子とつきあっている
Gさんは誰ともつきあっていない(自慰だけに)
39NAME IS NULL:2013/12/09(月) 19:43:33.66 ID:???
設計してるうちに似てきちゃったテーブルはひとつにまとめてますか?
40NAME IS NULL:2013/12/09(月) 20:29:20.47 ID:???
>>38
m f
---
A B
A C
D C
D D
D E
F B
F C
41NAME IS NULL:2013/12/09(月) 22:13:08.75 ID:???
>>40
このテーブルって、インデックスはどうやって張ればいい?
mとfでセットで春?
42NAME IS NULL:2013/12/09(月) 23:53:25.58 ID:???
そう。ユニークになるでしょ。
43NAME IS NULL:2013/12/10(火) 01:11:01.08 ID:???
インデックスはどうやって検索するかがメインだからなぁ
まあ、PKには普通インデックス張られるから、この場合ならm,fでPKにするだろうし
mから検索するならそのままでもいいけど、fから検索するんのが多ければ俺ならfか(f,m)のインデックス張るかもしれん
44NAME IS NULL:2013/12/10(火) 11:38:43.16 ID:???
ユニークであると、複数列インデックスの後ろだけって使われないから
(f,m)でインデックス貼るな
45NAME IS NULL:2013/12/10(火) 19:31:01.18 ID:???
ありがとう
mとfにそれぞれインデックス張りました
46NAME IS NULL:2013/12/10(火) 19:48:08.80 ID:0Naa032y
主キーについて教えて下さい。
ミック氏の書籍に「達人に学ぶDB設計 徹底指南書」には、
主キーに、"可変長文字列"を使用すべきでない。と書かれており、
コードやID(つまるところサロゲートキー?)を使うべきだとあります。

しかし、ネットで色々調べていると、サロゲートキーの使用は避け、
ナチュラルキー(これは可変長含む?)を使うべきだ。と言う解説も多くありました。

実際のところ、どのように両者を使い分ければ良いのでしょうか?
素人ながらに考えたのは、
ナチュラルキーが固定長文字列にできるのであれば、ナチュラルキー
それ以外はID(サロゲートキー)。なのかなと・・・。
経験者の方の意見をお聞きしたいです。
47NAME IS NULL:2013/12/10(火) 20:00:13.76 ID:???
>>46
なぜ可変長文字列を使用すべきではないかの理由はかかれていなかったの?
データ構造の話に言及してそうな気はするんだけど。
48NAME IS NULL:2013/12/10(火) 22:12:28.07 ID:4E3YwY8Z
後々カラムやテーブルを弄くる可能性があるなら
サロゲートキーで弄らないなら複合キーを使う
俺的にはそんなイメージ
49NAME IS NULL:2013/12/11(水) 02:08:25.89 ID:???
コードやIDが全てサロゲートキーだと思ってるならまずそこが間違ってる
50NAME IS NULL:2013/12/11(水) 05:34:25.98 ID:???
>>47
可変長にすると、"山田太郎"と"山田 太郎"が異なる値となるため、
たとえば外部キーで結合する場合に不一致が起こる・・・
可変長文字列が必要であるのなら変動する可能性が高い・・・
固定長と混合する可能性がある・・・
などと書かれていました。


>>49
現実世界を表す名称がナチュラルキーであるため、
それ単体でも意味を理解できるが、
サロゲートキーは単体では意味をなさない。
と、そのような理解をしています。
そういった意味では、ナンバリングの"1"もIDの"A001"も同じではないのでしょうか?
51NAME IS NULL:2013/12/11(水) 09:35:04.16 ID:???
http://gihyo.jp/dev/serial/01/sql_academy2/000304
ミックって人が書いてる。
2008年時点で可変長の内容は書いてないな

> サロゲートキーは,基本的には不要なものです。〜省略〜
> しかし,以下のような業務要件の場合には,サロゲートキーを使うことを考えます。
> @ そもそも入力データに主キーにできる項目がなく,データが重複している場合
> A 主キーの値が使いまわされる場合
> B 主キーの体系が変化する場合

ミックって人、訳の用語がぐちゃぐちゃで好きになれない
サロゲートキーを代理キーと訳されると、alternate keyはどうしたらいいのだ

>>50
システム側で独自に割り当て
システムでしか利用しない主キーをサロゲートキーと言うので

コードは外部で利用するために作ったものだと思うから
サロゲートキーではないよ

病院の待合室の機械で出てくる受付番号や
注文伝票で利用する商品コードとかな
"A001"はその類でしょ
52NAME IS NULL:2013/12/11(水) 11:03:31.56 ID:???
ちゃんとした日本語しゃべれ。
53NAME IS NULL:2013/12/11(水) 11:09:32.42 ID:???
ここ日本語厨おおいよな。
54NAME IS NULL:2013/12/11(水) 11:11:20.60 ID:???
普通に理解できるやん。
55NAME IS NULL:2013/12/11(水) 11:13:41.45 ID:???
>>51
サロゲートキーの訳語としての「代理キー」はメジャーだと思うけど。

例えばこことか。
ナチュラルキーとサロゲートキーについての議論
http://nippondanji.blogspot.jp/2013/12/blog-post_4.html

この人も嫌いなのか?
56NAME IS NULL:2013/12/11(水) 11:32:39.97 ID:???
>>55
>>51の記事のURL出して話してるから
ミックって人の引用でしょ
57NAME IS NULL:2013/12/11(水) 11:38:35.70 ID:???
>>56
> ミックって人の引用でしょ
わかってますが、それが何か?
58NAME IS NULL:2013/12/11(水) 12:29:55.48 ID:???
>>55
訳語としては「代替キー」のがメジャーだと思う

普段はそのまま「サロゲートキー」を使うから訳語を使わないんだけどさ
59NAME IS NULL:2013/12/11(水) 12:46:03.62 ID:???
>>58
疲れる。
どっちがメジャーかなんて話はしてないんだけど。
60NAME IS NULL:2013/12/11(水) 12:51:58.74 ID:???
マジでどうでもいいわ
61NAME IS NULL:2013/12/11(水) 12:56:18.44 ID:???
>>59
支離滅裂だなぁ
62NAME IS NULL:2013/12/11(水) 13:08:52.98 ID:???
そもそも、サロゲートの日本語訳が代理・代替なんだから、どっちでもいいだろ
63NAME IS NULL:2013/12/11(水) 13:10:23.88 ID:???
>>62
代理キーって別にあるからよくない
64NAME IS NULL:2013/12/11(水) 13:11:28.04 ID:???
>>61
何が言いたいんだか。

「訳の用語がぐちゃぐちゃ」の例として、「サロゲートキーを代理キーと訳される」って言ってるけど、
サロゲートキーを代理キーと訳すのも普通にあるということなんだけど。

どっちがよりメジャーかなんてどうでもいいわ。
65NAME IS NULL:2013/12/11(水) 13:12:29.54 ID:???
>>63
じゃ、>>55のリンク先の人も駄目ってことか?
66NAME IS NULL:2013/12/11(水) 13:15:16.66 ID:???
>>65
引用利用をとやかく言うって
>>55の先の人に恨みでもあるの?
67NAME IS NULL:2013/12/11(水) 13:17:38.32 ID:???
>>66
意味が分からん。

>>55のリンク先の人も、サロゲートキーを代理キーと言ってるけど、それはどうなのって聞いてるんだが。
68NAME IS NULL:2013/12/11(水) 13:19:51.13 ID:???
>>67
他ブログを引用して記事を書くとき
元ブログの文言をそのまま使うことは往々にしてあるので
どうも思わん
69NAME IS NULL:2013/12/11(水) 13:20:55.70 ID:???
>>66
MySQL業界外では結構嫌われてるからね。
70NAME IS NULL:2013/12/11(水) 13:22:26.59 ID:???
>>68
引用とかしてないけど?
71NAME IS NULL:2013/12/11(水) 13:26:38.16 ID:???
>>70
わからないならいいよ
>>55の人、その記事以外では代理キーって書かないんだよ
72NAME IS NULL:2013/12/11(水) 13:29:27.62 ID:???
元の話に戻そうぜ、どうでもいいことを引っ張るなよ
73NAME IS NULL:2013/12/11(水) 13:35:34.16 ID:???
この中に>>8居るだろ
74NAME IS NULL:2013/12/11(水) 13:40:56.20 ID:???
前スレの太郎次郎三郎のあたりからもうずっとおかしい。
俺は全部同一人物じゃないかと睨んでるんだが。
75NAME IS NULL:2013/12/11(水) 13:55:53.11 ID:???
76NAME IS NULL:2013/12/11(水) 13:58:44.38 ID:???
>>75
うざい
77NAME IS NULL:2013/12/11(水) 14:02:57.32 ID:???
全部>>51の自演
78NAME IS NULL:2013/12/11(水) 14:04:55.95 ID:???
>>77
うざい
79NAME IS NULL:2013/12/11(水) 14:09:59.77 ID:???
>>46
この辺読むといいかもよ。

リレーショナルモデルのドメイン設計についての議論
http://nippondanji.blogspot.jp/2013/12/blog-post_8.html

IDの設計についてのさらに突っ込んだ議論
http://nippondanji.blogspot.jp/2013/12/id.html
80NAME IS NULL:2013/12/11(水) 14:10:29.36 ID:???
代理キーにしたくてしょうがない人がいる?
81NAME IS NULL:2013/12/11(水) 14:11:34.34 ID:???
代理キーと訳されるのが我慢できない人がいる
82NAME IS NULL:2013/12/11(水) 14:17:36.99 ID:???
>>80 >>81
うざい
83NAME IS NULL:2013/12/11(水) 14:23:57.11 ID:???
wikipedia厨が現れるころかい
84NAME IS NULL:2013/12/11(水) 14:32:54.43 ID:???
>>83
うざい
8547:2013/12/11(水) 15:27:09.13 ID:???
スレが進んでいると思ったら、またどうでもいいことで伸びていただけだった。

>>50
ありがとう。そっちの理由なのか。なんともいえない気持ちになるなぁ。。

まぁ、ほんとに不変な自然キーってなかなか無いので、
なんだかんだある程度の覚悟はしとかないといけないよね。
86NAME IS NULL:2013/12/11(水) 16:31:28.80 ID:???
ホントに永遠に不変なものなんて世の中には存在しないが
システム開発において、これは不変だとして扱いますよと決めるのが要件定義
ある程度覚悟とか、要件定義の甘さをごまかしてるだけだろ
87NAME IS NULL:2013/12/11(水) 16:58:31.51 ID:???
要件定義でしっかり決めたところで、「ホントに永遠に不変なもの」じゃないんだから変わりうるでしょ。
なぜ話をひっくり返して要件定義が甘いとかずれた話になるんだろ。
88NAME IS NULL:2013/12/11(水) 18:25:22.27 ID:???
いつもの人だから、論理矛盾だらけなんです。
89NAME IS NULL:2013/12/11(水) 18:32:29.28 ID:???
>>85-87
有る程度、「何を」覚悟するんだ
要件変更による設計変更なのか
要件変更の伴わない設計あるいは実装の変更なのか
90NAME IS NULL:2013/12/12(木) 01:20:20.96 ID:???
要件定義を行った段階では、客も不変だと認識していてかつ、それで進めてよいとなったものが
運用中に変更になることなど。
つまり、ベンダもクライアントも不変だとしていたものが、そうではなくなることを覚悟する。

つか、あなたが想定していそうな、ベンダの思い込みで実装するような馬鹿じゃないんですよ。
9146:2013/12/12(木) 05:54:48.85 ID:???
スレが伸びててビックリっす!

すいません。質問したキッカケは、
可変長文字列(varchar(50)とか)の列を
5列ぐらい主キーに設定していたので、
「これは、まとめてサロゲートキーした方がいいじゃないのかな?
どっちがいいんだろう?」
って事を知りたかっただけなのですが・・・

参考URLなどありがとうございます。勉強します。
92NAME IS NULL:2013/12/12(木) 09:21:37.75 ID:???
荒れたってより食ってかかるやつが現れた印象
93NAME IS NULL:2013/12/12(木) 11:43:50.96 ID:???
>>92
日本語も論理も変な奴が常駐してるせい
94NAME IS NULL:2013/12/12(木) 13:01:42.82 ID:???
>>93
放置すれば良いよ
95NAME IS NULL:2013/12/12(木) 13:09:54.66 ID:???
今まで主キーが不変であったためしが無いので
サロゲーロキー一択だなぁ
ナチュラルキーにしたいけど顧客の無茶な仕変がこわすぐる
96NAME IS NULL:2013/12/12(木) 13:11:15.57 ID:???
>>93
論理が変な奴ってこれか?
>>55 >>57 >>64 >>70

日本語変なのってこれか?
>>51
97NAME IS NULL:2013/12/12(木) 13:15:04.08 ID:???
>>95
結合テーブルはどうしてた?
98NAME IS NULL:2013/12/12(木) 13:42:19.40 ID:???
>>96
>>89とかだろ
99NAME IS NULL:2013/12/12(木) 13:45:21.77 ID:???
>>96
>>8,10,20とか。
100NAME IS NULL:2013/12/12(木) 13:48:32.10 ID:???
>>97
「結合テーブル」って何?
で、どうしてたって何を?
101NAME IS NULL:2013/12/12(木) 13:51:43.07 ID:???
Rails禁止なので。
102NAME IS NULL:2013/12/12(木) 14:08:28.03 ID:???
もうサロゲートキーの話題も禁止でいいんじゃないか?
103NAME IS NULL:2013/12/12(木) 14:10:07.37 ID:???
>>100
「結合テーブル」は「連関エンティティ」の実装のテーブル
どうしてたって、サロゲートキーつけてた?って聞きたかった

>>101
結合テーブルはRails用語ではないよ
104NAME IS NULL:2013/12/12(木) 14:12:19.33 ID:???
>>103
> 「結合テーブル」は「連関エンティティ」の実装のテーブル
> どうしてたって、サロゲートキーつけてた?って聞きたかった

その話題は、前スレからさんざん出てるじゃん。
まだ荒らし足りないの?
105NAME IS NULL:2013/12/12(木) 14:16:29.77 ID:???
>>104
意味わからんぞ。>>95の人がつけたかつけなかったを聞いただけだ

過敏になりすぎ
106NAME IS NULL:2013/12/12(木) 14:18:54.66 ID:???
ビクッ
107NAME IS NULL:2013/12/12(木) 14:20:04.80 ID:???
>>105
それ聞いてどうすんだよ。
お前には関係無いだろ。
108NAME IS NULL:2013/12/12(木) 14:22:34.52 ID:+HgL5VL3
また荒らす
109NAME IS NULL:2013/12/12(木) 14:22:34.51 ID:???
>>105
>>95ではないが、俺はつけるよ
110NAME IS NULL:2013/12/12(木) 14:27:13.33 ID:???
>>107
理由もわからないなら、返信しなくて良いのに
111NAME IS NULL:2013/12/12(木) 14:28:56.24 ID:???
>>110
うざい
112NAME IS NULL:2013/12/12(木) 14:30:37.75 ID:+HgL5VL3
>>111
やっぱその人か…
出しゃばらなくていいんだよ
113NAME IS NULL:2013/12/12(木) 14:32:21.95 ID:???
>>112
いや、マジで聞いてどうすんのよ?
114NAME IS NULL:2013/12/12(木) 14:33:59.24 ID:???
>>103
> 結合テーブルはRails用語ではないよ

定義がどっかにある?
115NAME IS NULL:2013/12/12(木) 14:36:19.25 ID:???
JOIN
116NAME IS NULL:2013/12/12(木) 14:38:44.85 ID:???
Rails脳
117NAME IS NULL:2013/12/12(木) 14:51:34.47 ID:???
>>114
定義がどこかにあるかは知らないが
データベース設計を10年以上前からやってるけどそのころから普通に
"Junction Table"を用語として使ってて
それを訳すときは"結合テーブル"にしてた
118NAME IS NULL:2013/12/12(木) 14:53:59.03 ID:???
junction tableなら「交差テーブル」じゃないの?
119NAME IS NULL:2013/12/12(木) 14:56:55.38 ID:???
前スレでRails厨がRails用語を乱発しまくったせいでスレがおかしくなった
120NAME IS NULL:2013/12/12(木) 14:59:19.00 ID:???
>>118
"Cross Reference Table"を訳すときに使ってた
同じ意味って
121NAME IS NULL:2013/12/12(木) 15:06:55.65 ID:???
>>120
頼むからまともな日本語しゃべってくれよ
122NAME IS NULL:2013/12/12(木) 15:08:23.13 ID:???
>>121
なにがわからないの?
123NAME IS NULL:2013/12/12(木) 15:09:40.18 ID:???
ジャパニーズ
124NAME IS NULL:2013/12/12(木) 15:10:11.11 ID:???
cross reference tebleなら「相互参照テーブル」じゃないの?
125NAME IS NULL:2013/12/12(木) 15:11:07.44 ID:???
>>117
> 定義がどこかにあるかは知らないが

見つけてこいや
126NAME IS NULL:2013/12/12(木) 15:16:00.56 ID:???
>>124
DB設計でもその訳のがいいのかな
127NAME IS NULL:2013/12/12(木) 15:16:07.22 ID:???
>>122
> 同じ意味って
これどういう意味?何かの方言?
128NAME IS NULL:2013/12/12(木) 15:18:25.98 ID:???
要するに、Junction Tableを結合テーブルと訳し、Cross Reference Tableを交差テーブルと訳してたってことか?

それは異端だと思うわ。
129NAME IS NULL:2013/12/12(木) 15:24:49.36 ID:???
>>103
最初から、「連関エンティティにもサロゲートキーをつけてるのか?」と質問しておけば、こんなことにはならなかった。

まあ、何の為にそれを知りたいのかは俺もわからないけど。
130NAME IS NULL:2013/12/12(木) 15:26:52.00 ID:???
>>127
結合テーブルと交差テーブルが同じ意味ということ

>>128
そうだね

"Cross Reference Table"はOracleで別の意味でも使われてて
そっちは別の訳にしてた
131NAME IS NULL:2013/12/12(木) 15:30:05.19 ID:???
>>130
> "Cross Reference Table"はOracleで別の意味でも使われてて
> そっちは別の訳にしてた

これのこと?
http://docs.oracle.com/cd/E23549_01/integration.1111/b56238/med_xrefs.htm
132NAME IS NULL:2013/12/12(木) 15:32:18.70 ID:???
>>130
> 結合テーブルと交差テーブルが同じ意味ということ

これは煽りじゃ無くてお願いね。
それならそうと最初から書いてよ。無駄にレスの往復が増えるから。
133NAME IS NULL:2013/12/12(木) 15:39:17.13 ID:???
>>129
> 最初から、「連関エンティティにもサロゲートキーをつけてるのか?」と質問しておけば、こんなことにはならなかった。
すまん。反省してる

> 今まで主キーが不変であったためしが無いので
> サロゲーロキー一択だなぁ
連関エンティティだと主キーが不変にならないのかなと思ったから聞いた
サロゲートキーつけるって言われたら不変でないポイントを聞きたかった

>>131
それだね

>>132
すまん
134NAME IS NULL:2013/12/12(木) 16:37:01.89 ID:???
気が済んだ?
135NAME IS NULL:2013/12/12(木) 16:47:06.76 ID:???
結合テーブル=関連テーブル≒連関エンティティっていうことでいいじゃない
136NAME IS NULL:2013/12/12(木) 17:30:33.89 ID:???
いっそちゃんとした日本語の定義を、お前らがここで話し合って決めろよ
137NAME IS NULL:2013/12/12(木) 17:50:04.94 ID:???
138NAME IS NULL:2013/12/12(木) 17:55:55.22 ID:???
サロゲートキーが代替キーでも代理キーでもいいし、結合テーブルでも関連テーブルでも交差テーブルでもいいじゃん。

お前らの好きなWikipediaもこう書いてる。
> Junction tables are known under many names, among them cross-reference table,
> bridge table, join table, map table, intersection table, linking table, many-to-many resolver,
> link table, pairing table, pivot table, transition table, or association table.

文脈でわかるだろ。
139NAME IS NULL:2013/12/13(金) 15:20:17.30 ID:???
>>133
> 連関エンティティだと主キーが不変にならないのかなと思ったから聞いた
> サロゲートキーつけるって言われたら不変でないポイントを聞きたかった

?
140NAME IS NULL:2013/12/13(金) 15:36:03.87 ID:???
>>139
過去レス嫁よ
141NAME IS NULL:2013/12/13(金) 15:44:56.27 ID:???
>>140
君、>>133なんだろうけど、まだ意味わかんないよ
142NAME IS NULL:2013/12/13(金) 15:50:06.90 ID:???
>>141
>>133ではないんだが・・・荒らすなよ
143NAME IS NULL:2013/12/13(金) 16:00:58.23 ID:???
>>142
どういう意味なのかわかってるのなら、教えてくれます?
144NAME IS NULL:2013/12/13(金) 16:15:14.33 ID:???
もうそのへんにしとけ
145NAME IS NULL:2013/12/13(金) 16:15:56.64 ID:???
あと、>>140もいらんちゃちゃ入れずに完全無視しろ
146NAME IS NULL:2013/12/13(金) 16:33:03.72 ID:???
>>103
サロゲートキーとサロゲートキーをくっつけてるテーブルには
サロゲートキーをつけなかったよ
147NAME IS NULL:2013/12/13(金) 17:39:37.14 ID:???
それが普通
148NAME IS NULL:2013/12/13(金) 19:10:52.65 ID:???
そしてまた何周めかのループに突入すると
149NAME IS NULL:2013/12/13(金) 20:08:01.77 ID:???
ループの前に話をずらすステップが入るよ
150NAME IS NULL:2013/12/13(金) 20:09:53.98 ID:???
楽しそうだな
151NAME IS NULL:2013/12/14(土) 00:55:25.42 ID:???
いつまでサロゲートの話してんだよ
152NAME IS NULL:2013/12/14(土) 01:35:43.22 ID:???
他の話題がないんだ
153NAME IS NULL:2013/12/14(土) 11:35:08.43 ID:???
サロゲート職人の朝は早い
154NAME IS NULL:2013/12/15(日) 09:50:26.06 ID:???
まぁ好きではじめた仕事ですから
155NAME IS NULL:2013/12/20(金) 11:39:32.84 ID:???
id厨が飽きちゃったら、もはや語られる話題が無い件について
156NAME IS NULL:2013/12/20(金) 11:41:58.41 ID:???
KVSで盛り上がって欲しい
157NAME IS NULL:2013/12/20(金) 14:51:54.09 ID:???
KVSは一応スレがある

【KVS】 Key-Value Storeを勉強するスレ
http://toro.2ch.net/test/read.cgi/db/1267115925/
158NAME IS NULL:2013/12/20(金) 19:32:20.25 ID:???
外部キーが書き換えられたときに自動で追従させたいんだけど
トリガー使って一緒に書き換えは可能?
159NAME IS NULL:2013/12/22(日) 00:28:50.75 ID:???
可能だし、DBMSによってはそういう設定ができる
160NAME IS NULL:2013/12/22(日) 05:23:06.61 ID:???
まあ、基本DBMSに依るんで何とも言えんが
外部キーの変更をカスケードして追従する機能があったり
トリガでの更新だと制限があったりすることもある

が、外部キーの値が書き換えられる状況がまず正しいか検討するべきじゃないかと
161NAME IS NULL:2013/12/23(月) 09:50:29.46 ID:ffNWKxBT
普段は運用の仕事をしているSEだが、上司にDBの設計をやりたいと話したら
DBはプログラミングと関わっているから〇〇の部署に行けよという
話になったが、DBの設計ってアプリ部分の話を指すのが普通なのか?
俺は、インフラ部分の方式設計や物理設計をやりたいという意味で言ったんだが。

この場合は、上司と俺のどちらの認識が正しいのか教えてください。
162NAME IS NULL:2013/12/23(月) 09:56:10.08 ID:???
>>161
上司
163161:2013/12/23(月) 10:03:54.64 ID:???
>>162
そうなんですか・・・orz
DBのインフラ部分の方式設計や物理設計、パラメータの設計をやりたいという
希望を伝えたい場合、どういう伝え方がいいんでしょうか。
質問ばかりですいません。
164NAME IS NULL:2013/12/23(月) 10:30:37.62 ID:???
>>163
> DBのインフラ部分の方式設計や物理設計、パラメータの設計をやりたいという

相当でかいシステムでない限りそこだけ単独で担当つけたりしない
(そう言うケースだと、それなりのスペシャリストでないと歯がたたん)
ソフトウェア設計の一部になるから、その手の部署に行くしかないよ

そもそもこんなこと聞いてる時点で、そんな設計できる能力あるのか疑問なんだが...
165NAME IS NULL:2013/12/23(月) 11:18:37.37 ID:Qc7rtsKy
>>164
素人なんでよく分かってないんですいません。
仕事のイメージとしては、各種サーバの構築(OS、JP1等のソフトのインストール)や
動作確認等のテスト等の作業と併せてDBの方式設計、構築をするという感じです。
上司には、上記のような仕事をしたいという伝え方がいいのでしょうか。
166NAME IS NULL:2013/12/23(月) 11:35:46.73 ID:???
>>165
ねえ、人の話聞いてる?

> ソフトウェア設計の一部になるから、その手の部署に行くしかないよ

って書いてあるんだが...
167NAME IS NULL:2013/12/23(月) 11:38:08.21 ID:???
>>165
DB設計うんぬんの前に、コミュニケーションの原則として、
相手に自分の意志を伝達したいのであれば、それを具体的に説明すべき
(抽象的な表現を都合のいいように解釈してくれると勘違いするな!!)
つまり、>>165で書かれたイメージを上司に話すことが第一歩になる

職場の異動希望、成功を祈るよ
168161=164:2013/12/23(月) 11:58:17.32 ID:???
>>166
すいません。気を付けます。

>>167
ご指摘ありがとうざいます。
インフラ設計、構築の仕事を希望していたのは、元々オラクルの
資格勉強をしていてDBのソフトの設定等に興味があったからなんですよね。
異動希望が絶対に叶うように頑張ります!
169NAME IS NULL:2013/12/23(月) 13:12:23.81 ID:Sfh6mz3Q
世の中に「絶対」は無い
170NAME IS NULL:2013/12/23(月) 13:22:59.12 ID:???
>>169
「絶対」は「絶対」にないの? (w
171NAME IS NULL:2013/12/23(月) 13:38:34.43 ID:hLwsZxNF
死に物狂いで勉強して、
障害復旧やらDBのバグ解析や回避方法などの、
実務経験とスキルを積み上げて、
ぎょうかいでなまえをしられた大企業に就職できたら
希望は叶う可能性があるかも知れないな、って思ったよ
頑張れ
172NAME IS NULL:2013/12/23(月) 14:44:41.76 ID:???
>>170
ないよ
173NAME IS NULL:2013/12/23(月) 15:49:38.08 ID:???
てことはあるんじゃんw
174NAME IS NULL:2013/12/23(月) 17:58:05.61 ID:???
>>168
チューニングしたいって言えばなんとなく通じてくれるかもしれないけど、まぁ、具体的に話をするのが一番いい。
クエリ改善も含まれるけど、それだって大切な仕事だ。
175NAME IS NULL:2013/12/23(月) 18:43:42.31 ID:???
AとBの依存関係を持つテーブルCがあるとします。
C の構成は idA, idB しかない。

インデックスは idA,idB それぞれに振ってる。
あと、idA,idBでユニークインデックス振ってるんだけど
インデックス振り過ぎ?
176168:2013/12/23(月) 20:38:47.00 ID:???
>>174
チューニングっていう表現だとアプリ部分も含まれるんですかね?
次の面談では上司にオラクルの資格勉強を通してDBの設定操作に興味を
持ったので各種サーバーの設計、構築、テストをするインフラ部分の仕事をしたい
という感じで伝えてみようと思います。
177NAME IS NULL:2013/12/23(月) 20:51:07.99 ID:???
>>175
基本DBMSによるけど

それ(idA,idB)で主キーになってるんじゃないのか?
ほとんどのDBMSで主キーに勝手にユニークインデックス張ってるんじゃね
それ以外に自分で張ってるなら全く無駄なインデックス張ってるかもしれんぞ

(idA,idB)のインデックスとidAのインデックスが同時に使われることはないだろうし
idAのインデックスからidBを得るにはインデックスから実データの参照が必要
idAに普通にインデックス張るのは無駄かもしれん
178NAME IS NULL:2013/12/23(月) 23:14:15.58 ID:???
>>175
インデックス張りの追加可否については、
そのDBを利用するアプリケーションのアクセスパスを元に判断する

たとえば>>175の例で A と B が(C を介して) m:n 関係であったとする
そしてアプリケーションのDBへのアクセスパスを分析(*)したところ、
A の行を元に対応する B の行集合を得る操作が大半で、
その逆に B から A を得る操作はごく僅かであったとする
この場合、idA にインデックスを張ることによって、
システム全体の性能改善が期待できると判断できる

(*)アクセスパスの分析は、以下に示す二段階で実施すべき
・アプリケーション設計時:
  アクセス頻度を設計値として見積もり、DBの物理設計書(テーブル仕様書)へ明記する
・システム連動テスト時:
  ログを解析し、実環境でのアクセス頻度が見積もりと一致することを確認する
179NAME IS NULL:2013/12/24(火) 04:27:06.39 ID:???
インデックスは張れば使うってもんでもないんで、そのインデックスが有効かどうか考えんと
パターンとしてはAからBを検索、BからAを検索、ABペアで検索の3通り
(実際にその全てのパターンでアプリが検索するとはかぎらないんだが、一応全部想定する)
いま考えるべきは
Aから検索するときに、A,Bの複合インデックスとA単独のインデックスではどっちがより有効か?
Bから検索するときに、B,Aの複合インデックスとB単独のインデックスではどっちがより有効か?
ペアで検索するときにABとBAでどっちの複合インデックスがより有効か
の三つじゃないかね

俺の考えでは同じ普通のインデックスなら、ABの複合が有ればA単独のインデックスに出番はないと思うが
例外があるとすれば、ABの複合よりA単独の方がインデックスページのIO量が少なくて済むから、
超巨大なデータでそれなりのカーディナリで実データルックアップ差し引いても速いときぐらい?
実際にそんな状況が起こりえるかな?
Bからのパターンも同様
ペアで検索はAとBでどっちがカーディナリ高いかで差が出るかもしれん。大差は出ないと思うが、気になるなら
両方作ってオプティマイザに任せるのがいいかも

ということで、俺ならABの複合インデックスとBAの複合インデックス二つだけ作っておくかな
あくまで速度メインで考えた場合だけど
180NAME IS NULL:2013/12/24(火) 10:53:27.13 ID:???
>>177-179
みんなー! ありがとうー!
とりあえず、(idA)単体のインデックスはすてました
181NAME IS NULL:2013/12/24(火) 13:50:48.07 ID:???
スロークエリをログに出力するようにしとけばOK
182NAME IS NULL:2013/12/25(水) 03:13:21.40 ID:???
すいません。圧倒的に場違いなのは理解してるのですが、DBに詳しい方教えてください。

自分はポストグレの入門書をかじり、サーブレットのJDBCを理解できる程度の者です。

この状態で、英語辞書のようなもの(たとえば、alcといったようなサイトのように、単語を打ち込むと日本語訳と例文がでてくるようなもの。)
を作りたいのですが、どのようにすれば効率がよく作れるのでしょうか?
183NAME IS NULL:2013/12/25(水) 04:28:35.99 ID:???
>>182
どっかの業者に金払って作ってもらう
184NAME IS NULL:2013/12/25(水) 04:57:16.91 ID:???
>>183
勉強も兼ねて自分でやりたいのです。

どのDBを使えばやりやすいのでしょうか?もしくはプログラミングなどを書けば利用すれば自動でできるものなのでしょうか?
185NAME IS NULL:2013/12/25(水) 06:56:48.06 ID:???
入門書を物理的にかじりでもしたの?JDBCを理解できる程度ってのも意味がわからないし。
低機能なものなら学生の宿題にでてもおかしくないレベルだし、まずDB使わずに作ってみたらどう。
186NAME IS NULL:2013/12/25(水) 10:48:09.00 ID:???
まず、英単語の日本語訳と例文をどうやって準備するのかが難しいような
187NAME IS NULL:2013/12/25(水) 11:22:11.63 ID:???
>>178
>   アクセス頻度を設計値として見積もり、DBの物理設計書(テーブル仕様書)へ明記する
アクセス頻度って何?
単位時間あたりのアクセス数とか?
で、何らかの閾値を超えたりしたら、何か物理設計を変更するとか?
188NAME IS NULL:2013/12/25(水) 13:42:27.13 ID:???
>>187
普通に、必要に応じてインデックスを追加するって話だと思うよ
189NAME IS NULL:2013/12/25(水) 13:56:26.58 ID:???
>>188
あなたには聞いてません
190NAME IS NULL:2013/12/25(水) 15:17:58.00 ID:???
>>186
いや、それは既にできてるんです。

しこしこhsqlに入れて言って、JDBCでブラウザに表示まではできます。

しかし、あまりにも重労働すぎるので、まだここらは初心者なので、ハック的な技術があるか聞きたかったのです。

DB操作なので、そこまでプレミアムなスキルでもないとは思ってるのですが、やはり不可能でしょうか
191NAME IS NULL:2013/12/25(水) 15:24:35.48 ID:???
>>190
今、何を効率が悪いと感じていて、何を重労働と感じているのかを書かないと、アドバイスのしようがない。
そして、多分その回答はスレ違いだと思われる。
このスレは、「データベース設計」のスレなので。
192NAME IS NULL:2013/12/25(水) 16:35:30.38 ID:???
>>190
元ネタからinsert文でも作って流せばいいんじゃないの。
193NAME IS NULL:2013/12/25(水) 17:10:49.53 ID:???
登録が大変ってことなら、一括インポートすればいいじゃない
てか、DB設計となんの関係もないが
194NAME IS NULL:2013/12/25(水) 17:28:36.48 ID:???
スレ違いだとわかってて平気で質問するような奴をまともに相手しちゃイカン
195NAME IS NULL:2013/12/27(金) 00:27:47.60 ID:???
辞書つくりたい。

どのDB使えばいいか教えてください。お願いします。

どの本よめばいいですか?
196NAME IS NULL:2013/12/27(金) 05:19:59.69 ID:???
「ポストグレの入門書をかじり」終えたなら、次はその本をしゃぶりつくすこと。
197NAME IS NULL:2013/12/28(土) 13:57:10.40 ID:???
>>196
そのあとは何をやればいいでしょうか?
198NAME IS NULL:2013/12/28(土) 19:44:11.56 ID:???
問題の切り分け能力をつけるために雪山に登山する。
199NAME IS NULL:2013/12/28(土) 21:49:55.11 ID:???
>>198
そのあとはいかがすればいいでしょうか?
200NAME IS NULL:2013/12/29(日) 00:13:12.63 ID:???
>>199
やってからどうぞ
201NAME IS NULL:2013/12/29(日) 09:58:05.95 ID:???
生徒の出席状況を確認するシステムを作りたいと考えています。
月ごと、年ごとにカレンダーで一覧を表示したいのですが
student_id, year, month, day
を持つテーブルを作って、生徒が一日一回出席をボタンを押すたびに
その日をinsertするという形を考えました。
もっとうまい方法があれば教えて頂けないでしょうか。
よろしくお願いします。
202NAME IS NULL:2013/12/29(日) 10:13:47.42 ID:???
2行目、ユーザーごとに月ごとにカレンダーで一覧を表示したい
の間違いです。すみません。
203NAME IS NULL:2013/12/29(日) 13:52:18.62 ID:???
>>201
> year, month, day

Date 型でいいんじゃね?
204NAME IS NULL:2013/12/29(日) 16:47:09.07 ID:???
>>201
要件がそれだけならそれでいいんじゃね、としか言えないな

うまいって言うのは、何がどうなってればうまいと思うの?
今何がまずいと思うの?
205NAME IS NULL:2013/12/29(日) 17:31:09.27 ID:P0pfEg/A
>>203
Date型を初めて知ったのでググってみます。

>>204
これでいいのか自信が無かったのでお聞きしました。
プログラムとか経験ないのに作れと無茶振りされたもので…
206NAME IS NULL:2013/12/29(日) 18:15:46.26 ID:OD3whmkM
同じ年月日で1件しか受け付けないなら、8桁の数値型でいいように思う。
207NAME IS NULL:2013/12/29(日) 19:34:23.48 ID:???
タイムレコーダーみたいなもんだろ
同じidでも時刻入りで入力は全部記録するべきと思う
208NAME IS NULL:2013/12/29(日) 20:03:04.43 ID:???
>>206
なんでそんな面倒な設計にするんだ...
209NAME IS NULL:2013/12/29(日) 20:37:58.37 ID:???
Date型にしない理由が見当たらん
210NAME IS NULL:2013/12/29(日) 22:51:20.12 ID:???
あえて理由をつけるなら、年月で絞る時にインデックスが効きやすいとか
まあ、億オーダーのレコード数でもなければ普通に日付型で良いだろうけど

いまどき日付型のないDBMSとか有るかな?
211NAME IS NULL:2013/12/29(日) 23:55:12.54 ID:???
インデックスの効きやすさに差が出てくるもんなの?
212NAME IS NULL:2013/12/30(月) 00:11:28.56 ID:???
年、月、日で別項目なら、年、月でインデックスはれば密度が違うからなぁ
数字8ケタとかなら大差ない気はするけど
日付型はうっかり変換関数とかにかけて悲惨な事になったりすることも
まあ、最近のDBMSなら関数噛ませてインデックスに出来るやつもあったような
213NAME IS NULL:2013/12/30(月) 00:21:17.18 ID:???
年月日のインデックスのほかに年月のインデックスを貼るん??
214NAME IS NULL:2013/12/30(月) 00:32:23.64 ID:???
月ごと年毎にカレンダーで一覧表示ってあるけど、
国内だと年毎=年度毎だったりするから、
年月日別より年月と日の方が扱いやすいかもしれない。
列結合の検索(INDEXききづらい)や複数項目使った範囲検索すればいいって
話だけど、単項目の検索のほうが楽だし、バグも当然少ない。
INDEXも明確にわかりやすい。

初心者みたいだし、日付型の項目を一緒に作っておいて、
登録データを見ながら、やってみてはどうだろうか。
215211:2013/12/30(月) 00:58:10.60 ID:???
>>212
ああ、ごめん。
数字8桁のほうがインデックス効きやすいと言ってるのかと勘違いしてた。それなら納得。
書いてくれてるように、式インデックス使えるならそれ使ってもいいね。
216205:2013/12/30(月) 03:13:16.40 ID:???
>>214
>日付型の項目を一緒に作っておいて、
>登録データを見ながら、やってみてはどうだろうか。
このやり方でやってみようと思います。
皆さんありがとうございます。
217NAME IS NULL:2013/12/30(月) 03:41:44.12 ID:???
出欠システムなら日付の他に遅刻早退中抜け情報も必要なんじゃねか
要件として不要とわかってるならいいんだが
218NAME IS NULL:2013/12/30(月) 04:09:56.25 ID:???
年月と日とかよっぽど特殊な要件がないと利点が見出せん
日付型と年月日の数字で実データ持つって、10年前のRDBMSならともかく今時ありえんわ
219NAME IS NULL:2013/12/30(月) 09:35:37.71 ID:???
>>216
> このやり方でやってみようと思います。

なんでそれを選択するかなぁ...
220205:2013/12/30(月) 09:56:38.07 ID:???
>>219
あまりいいやり方ではないのだろうなというのはわかるのですが
date型のwhere句の書き方がわかっていないからです。
int型で年、月、日を持っていれば
where year = 2013 and month = 12
のように書けばいいのはわかります。
来月4日までに完成させないといけないという時間的な問題もあるので
とりあえず動くように作っておいて後からdate型だけに統一するつもりです。
221NAME IS NULL:2013/12/30(月) 12:45:50.34 ID:???
>>220
大抵の DBMS には Year とか Month とかの関数があるかも、ぐらいは思い付かない?
まあ、期限あるならしょうがないかもな。
222NAME IS NULL:2013/12/30(月) 13:02:36.69 ID:???
式NDEXとか、初心者時代やらないだろ?
カラムに対して、関数つけて検索しないってのはある種のお約束じゃないか?

date型where句の書き方も曖昧みたいだし、
最初は自分のイメージを形にする方優先でいいと思う。

俺は>>220には賛成
223NAME IS NULL:2013/12/30(月) 13:09:39.20 ID:???
年、月、日の数字で持つのはまあそれでもいいけど
同じ情報を二つ持つのはやめなさい
手間とトラブルを増やすだけだから
224NAME IS NULL:2013/12/30(月) 13:44:47.82 ID:???
最初は年月日を数字で持つほうがイメージ湧くから良いと思う
Date型は必要だと思ったときに足せば良いだけだから最初はいらないんじゃないか?

たださ、インデックスの問題で年月のが有利ってのは理解できないぞ
225NAME IS NULL:2013/12/30(月) 14:25:39.38 ID:???
年月のが有利って思ったのは、月別、年別で一覧表示と
あったので、年・月・日と個々に項目を持った場合、
年と月の複合キーか、年のINDEX、月のINDEXを個々に持つ。

仕様が年別と月別の一覧表示なら(集計のみを考えた場合)、
画面上のYYY年MM月をYYYYMMで検索の方がいいかなと。
これならINDEXも1つでいいし。

最近年月単位のパーティションとか作ってたから、頭がかたまってるかもしれん。
有利ってのはちょっと違うな。すまん。
226NAME IS NULL:2013/12/30(月) 14:29:10.94 ID:???
>>220
それが分かりやすいということについては分かる。
ただ、下期の一覧を出したい場合、たとえば、2012/10 〜 2013/3 を抽出したいときが面倒だよってぐらいかな。

来月4日までに作らないといけないって、たぶん、12月サボったツケだろうからがんばれとしか言いようがない。
227NAME IS NULL:2013/12/30(月) 21:56:26.34 ID:???
来月4日か。来年四月かと思ったわw
DB設計うんぬんより、ホストアプリでちゃんとプログラム組めるのかね
228NAME IS NULL:2013/12/30(月) 22:15:20.28 ID:???
1月4日はネタじゃねーの?
マジだったら、まずは Excel でやれって言うわ。
Excel で手に負えないならそもそも 1月4日 なんて無理だろうし。
229NAME IS NULL:2014/01/14(火) 13:38:32.08 ID:oHMfQEMd
レストラン、不動産、求人などの検索サイトは、「OR検索」が多発しますが、設計上の配慮はどのようなことがあるのでしょうか。
230NAME IS NULL:2014/01/14(火) 14:07:05.29 ID:???
>>229
まずは、普通に正規化すればいい。
検索に時間がかかるほどのデータ量の場合は、「転置インデックス」とかでググれ。
231NAME IS NULL:2014/01/14(火) 15:59:56.77 ID:???
≫230
>転地インデックス

そうか。各「OR検索」のフラグは、ユニークな文字列として全文検索用の別テーブルにスペース区切りで入れ、OR検索は全文検索に変えればいいのか!

ttp://dev.mysql.com/doc/refman/5.1/ja/fulltext-search.html
232NAME IS NULL:2014/01/23(木) 00:18:44.56 ID:???
>>230
MySQLの全文検索で検索自体はできることが確認できたのだけれど、任意のカラムで全文検索とは別の索引を使用した高速なソートができないことが判明。

別の索引でソートする機能はTritonnではできていたのに、
ttp://qwik.jp/tritonn/userguide.html#0cb0baa8b27d86e9233f601a9cc9cc4f

mroongaではできないっぽい。
どうしたらいいんだ。
233NAME IS NULL:2014/01/23(木) 22:53:35.79 ID:???
>>232
ttp://mroonga.org/ja/blog/2013/12/29/release.html

できるようになってたっぽい!
234NAME IS NULL:2014/02/01(土) 12:29:02.11 ID:???
顧客に経度カラム、緯度カラム持たすのってダサい?
235NAME IS NULL:2014/02/02(日) 16:02:38.86 ID:???
経度、緯度が必要なら持たさないとどうしようもないだろう
ダサいとかいう考え方がおかしいんだが

住所から導出できるだろうとか言う話なら要件次第
経緯まとめた項目ないかってならDBMS次第
236NAME IS NULL:2014/02/02(日) 16:59:37.09 ID:???
ダサいダサくないじゃなくて、顧客にダイレクトに緯度経度を紐付けたい
要件がパッと思い浮かばないんだけど、何かあるんかね

どういう要件があるのかってところが分からんと良いとも悪いとも言えん
237NAME IS NULL:2014/02/02(日) 17:36:05.55 ID:???
不動産か現在位置か
238NAME IS NULL:2014/02/02(日) 21:56:03.62 ID:???
顧客の現在位置を常に把握しないといけないってどういう業務?
239NAME IS NULL:2014/02/02(日) 22:26:05.91 ID:???
運輸業界かな?w
240NAME IS NULL:2014/02/02(日) 22:41:59.84 ID:???
タクシーの配車システムとか
241NAME IS NULL:2014/02/02(日) 22:43:07.74 ID:???
>>238
どこから「常に」なんて要件持ってきたんだ?
242NAME IS NULL:2014/02/03(月) 12:35:21.28 ID:???
>>241
じゃあときどきでいいよ
顧客の位置をときどき把握しないといけないってどういう業務?
243NAME IS NULL:2014/02/03(月) 13:41:30.16 ID:???
>>242
上でいっぱい言われてるだろ
不動産とか運輸業界とか、位置情報をもってるシステムはけっこうあるぞ
昔は緯度経度だけもっててもあまり役に立たなかったんんだが、最近では地図サービスが充実してるからなぁ
244NAME IS NULL:2014/02/03(月) 14:37:34.37 ID:???
コマツの土木車両にはGPSが標準装備されていて、
国内で稼働する全車両の位置情報が把握できる
詳しくは「コマツ GPS」でググレ
245NAME IS NULL:2014/02/04(火) 07:04:37.83 ID:???
不動産なら物件・運送なら車両・画像共有なら画像と紐付くと思うんだ<緯度経度
そうでなく顧客に直接紐付けというところに引っかかりを覚える

まあどうせ>>234はもう見てないだろうけど
246NAME IS NULL:2014/02/04(火) 07:52:16.70 ID:???
>>244
海外も把握してなかったっけ?
247NAME IS NULL:2014/02/04(火) 11:49:31.30 ID:???
友達を探す
248NAME IS NULL:2014/02/16(日) 09:53:05.01 ID:???
オブジェクト指向でコンポジットパターンと言われる構造のデータって、
どうやってテーブル化するべきでしょうか?

たとえば、

class 予定
{
 日時;
 場所;
};

class 買い物: 予定
{
 vector<品目> 買い物リスト;
};

class 訪問: 予定
{
 用件;
};

こんな感じのクラス階層のものです。

CREATE TABLE ScheduleHeader
(
 int id;
 datetime 日時;
 text 場所;
 int 予定タイプ; // 0 = 買い物, 1 = 訪問...
);

みたいにして、予定タイプを読んでプログラム側で詳細の取得先を切り替えるようにするのかなと思ったのですが、普通はどうするのでしょうか?
249NAME IS NULL:2014/02/16(日) 15:53:10.15 ID:???
>>248
大きく分類すると3つある
(1) シングルテーブル継承
 3つのクラス 予定/買物/訪問 を単一のテーブルで実装する
(2) クラステーブル継承
 3つのクラス 予定/買物/訪問 を個別のテーブルで(=3つのテーブルで)実装する
(3) 具象テーブル継承
 具象クラス 買物/訪問 だけをテーブルとして(=2つのテーブルで)実装する

それぞれに利点/欠点があってここでは書ききれないけど、
多くのORMは(たとえば Ruby on Rails の ActiveRecord は)
最も単純なシングルテーブル継承を基本としてサポートしている
詳しくは、以下の書籍(通称 EoA本)を読むべし
・エンタープライズ アプリケーションアーキテクチャパターン: マーチン・ファウラー
 http://www.amazon.co.jp/dp/4798105538/
250NAME IS NULL:2014/02/16(日) 16:54:02.82 ID:???
>>248ではシングルテーブル継承が主流のような書き方をしたけど、
個人的な意見ではあるが「DB設計」という視点からすれば、以下の問題がある
(これはEoA本では触れられていない)
(a) 買物インスタンスのテーブルでは用件カラムが、訪問インスタンスでは
 買物リストカラムが nullable になるので、検索時に潜在的なバグを生みやすい
(b) (a) によって参照性制約を設定できなくなるため、
 DBのデータ一貫性が損なわれる可能性がある
(c) 一つのテーブルに複数のエンティティを実装することになるため
 インデックス設計が複雑になり、性能問題を引き起こしやすい

従って、>>248 (2) のクラステーブル継承を推す
この方式については、EoA本では複数テーブルのJOIN操作が性能上で不利と書かれている
しかし、現実的なハード構成、簡潔なエンティティ、適切なインデックス設定、そして
SQLの知識を前提とすれば、経験上、数万件のオーダーで性能問題は起きたことがない

それでも現実にはシングルテーブル継承が主流なのは、ORMの採用による
システム開発の効率化優先(およびDB設計の相対的軽視)が背景にあると考える
251250:2014/02/16(日) 17:10:45.88 ID:???
>>250のアンカを訂正、>>248は間違いで正しくは>>249
252NAME IS NULL:2014/02/16(日) 18:25:03.41 ID:???
>>249-250
ありがとうございました、キーワードが分かっただけで検索がだいぶ楽になりました。
問題の本は、ちょっと高いので行き詰まったら購入を検討したいと思います。

構造的にはクラステーブル継承が好みですが、シングルテーブルなんてのもあるんですね
これは、真っ先にしかられるタイプの構造だと思ってました
253NAME IS NULL:2014/02/17(月) 03:14:40.87 ID:???
むしろRoRのActiveRecordってそんなの推奨してんの?
そんなところまでしばられちゃ正規化も何もあったもんじゃないんじゃないの。

(2)か(3)のどっちかで済ませるのがいいけど、まぁ、(2)は>>248で思ってたやり方そのままかと。
予定タイプを持つことの是非は状況次第。

あと、そもそも論だけれど、数万件のオーダーでしか話せない人は基本的に信用してはいけない。

ついでに、コンポジットパターンじゃないよね、それ。
254NAME IS NULL:2014/02/17(月) 15:46:39.31 ID:???
>>253
> ついでに、コンポジットパターンじゃないよね、それ。
マジでこれ。

つか、RoR馬鹿は黙ってて欲しい。
255NAME IS NULL:2014/02/17(月) 16:12:59.95 ID:???
買い物・訪問テーブルを個別に作り、両者を一覧で見たい場合はUNIONを使う、
というのが普通な気がするが。
256NAME IS NULL:2014/02/17(月) 18:21:51.34 ID:???
システムの要件がわからないとなんとも言えない
257NAME IS NULL:2014/02/20(木) 02:43:39.28 ID:???
文字コードUTF-8でデータを格納するための列の列長のバイト数って
どうやって設計するのがいいの?

シフトJISの頃だと、漢字や平仮名は1文字2バイトだって前提で
漢字10文字入れたい→20バイト、なんて風に設計してたけど、
UTF-8だとどうなんだろう
エンドユーザ側は、どの文字がUTF-8だと3バイトなのか、
4バイトになるのか、なんて意識してないよね

1文字3バイトが多いから30バイト、でいいのだろうか
でもそれだと、漢字10文字入れたいって場合に、4バイトの漢字だと
10文字入らなくなっちゃうよね

逆に4バイトの文字を考慮して40バイト、とすべきなのだろうか
でもそうすると、3バイト文字を13文字詰められちゃうから
変な不整合を起こしそう
258NAME IS NULL:2014/02/20(木) 12:49:30.10 ID:???
nつきの型はバイトベースじゃなく文字数ベースでの指定だったような
DB全体での容量計算の話なら文字コードUCSにすりゃいいんじゃないですかね(適当
259NAME IS NULL:2014/02/20(木) 17:21:34.45 ID:???
設計つか、容量見積の話じゃないのか
まあ、平均的なパターン見るか最悪のケースで見とくか
俺なら最悪のケースだけ計算しとくけど
260NAME IS NULL:2014/02/20(木) 19:20:16.03 ID:???
>>257
固定長カラムを作らなくなって久しいので、そう悩むことがなかった。
261NAME IS NULL:2014/02/20(木) 22:07:05.92 ID:???
>>258
DB全体の容量見積もりというよりかは、単なる列長の考え方、だと思ってます
Oracleでいう、ncharとかnvarchar2を使ってテーブルを作る、が標準なのでしょうかねぇ
ncharは使わずchar、という案件ばかりだったのですが、UTF-8を採用している案件って
実際のところ、ncharとか使ってるものなのでしょうか

>>259
容量計算する場合は、平均文字数はX文字と想定する、という要件があるので、
それで計算すればいいのかな、と
とはいえ、じゃあ1文字は何バイトなのよ?というのもあるかな、と

>>260
最大を大きめの可変長で作っておけばよかろうとは思っているのですが、
漢字30バイトの列には漢字が何文字入るの?と問われたときに、文字によって8文字〜10文字、
では都合が悪かろうな…とも思ってまして…

うーむ
262NAME IS NULL:2014/02/20(木) 22:20:27.32 ID:???
そもそも漢字30バイトの列とかあるか?
漢字がまともに扱えるDBMSなら指定は文字数なのが一般的なんじゃ?
漢字の想定の無い項目に漢字いれるとか恐ろしすぎる
263NAME IS NULL:2014/02/20(木) 22:28:19.51 ID:???
UTF8で扱えるんだよね?
264NAME IS NULL:2014/02/20(木) 22:59:24.51 ID:???
>>262
すいません、30バイトの列には漢字は何文字入るの?でした

NCHARで文字数指定する、一般的なのでしょうかね

漢字だろうが英数字だろうが、CHAR(n)で入るバイト数を指定、漢字は2バイト、と
これまでやってきたため、その考え方の変更が必要そうですね…
265NAME IS NULL:2014/02/21(金) 00:24:39.50 ID:???
ええと、そもそもなんだけど、
少なくともデータ長に関しては無頓着にクエリを発行して、
データベースエラーを元にvalidateを行おうとしているの?

> 逆に4バイトの文字を考慮して40バイト、とすべきなのだろうか
> でもそうすると、3バイト文字を13文字詰められちゃうから
> 変な不整合を起こしそう
266NAME IS NULL:2014/03/13(木) 16:48:47.68 ID:iuRydHHe
昔から悩んでいるのですが、
・会員情報(アカウント名、パスワード、メールアドレス
・プロフィール(性別、生年月日、写真、コメントなど)

を、1つのテーブルにするべきですかね?分けるべきですかね?
1対1なんで1つの方が良いとは思うのですが、
後々プロフィールのカラムを追加する可能性もあるので、
分けたほうがいいのかなとも思います。

オススメの方法・考え方を教えて下さい。
267NAME IS NULL:2014/03/13(木) 20:14:22.01 ID:???
>>266
参考書レベルの正規化では第2正規形にするあたりで別表にしそうなものだが、
実際問題としては、それ系のテーブルというものは、カラムの追加がないのなら、
無理に分ける必要は無い
性別、生年月日なんかも、分けて書いてる教科書もあるけど、異端をのぞいちゃ
変わるものでもないのだから会員情報テーブルに置いときゃOK

コメント2、コメント3、みたいなカラムの追加が予定されているなら、
プロフィールのその部分だけ別表に分けたほうがよかろうな

テーブルをは、教科書にそれで分けてる事例が書いてあるからって程度の理由で
分けるもんじゃない
運用でおかしくならないかどうかって観点で分けるのだ
268NAME IS NULL:2014/03/13(木) 20:47:38.42 ID:???
>>267
どこの世界の第2正規形の話をしてるの?
なんかカラムの追加が発生しうるテーブルは分割するのが基本だが、実際は〜みたいな言い回しだけど。

> 変わるものでもないのだから会員情報テーブルに置いときゃOK
これも、まるで理解できない。パスワードも異端をのぞいちゃ変わるものでもないってこと?
それとも、俗にいうマスタとトランの分割の話かな。
269NAME IS NULL:2014/03/13(木) 20:55:57.98 ID:???
267と268の間に、パスワードに関する記述があるのだろうか、と俺は
見えないモノを見ようとしてモニタを覗き込んだのであった
270NAME IS NULL:2014/03/13(木) 21:00:59.77 ID:???
> 異端をのぞいちゃ変わるものでもないのだから会員情報テーブルに置いときゃOK
変わるものなら会員情報に置かないほうがいいってことでしょ。
じゃあ、パスワードは変わらないの?ってことだけど。
271NAME IS NULL:2014/03/13(木) 21:03:08.62 ID:???
>>268
お前は今まで性別や生年月日を何回変えた?
272NAME IS NULL:2014/03/13(木) 21:04:55.34 ID:???
>>271
だからおかしいでしょ?
性別や生年月日は変わらないから会員情報に置けばいいよっていうなら、
変わるパスワードは会員情報から追い出さなきゃいけない。
273NAME IS NULL:2014/03/13(木) 21:10:20.38 ID:???
>>272
追い出したけりゃ、追い出せばいいんじゃね?

ところでその唐突に出てきたパスワードって、何の話なのだ
274NAME IS NULL:2014/03/13(木) 21:17:30.23 ID:???
>>268
「変わらないんだから分割する必要ない」
ということは
「変わるものは必ず分割する」
ということと、等価ではないよ

私は>>267が指摘している、性別や生年月日をまで別テーブルに分割する必要はない、
という見解には同意できるけど、でもパスワードは変更するから云々というのは、
飛躍しすぎだと考える
275NAME IS NULL:2014/03/13(木) 21:25:43.82 ID:???
>>273
もともと会員テーブルにあるカラムのことだけど。

>>274
変わろうが変わるまいが分割する必要はないという主張をするのなら、
変更されるのがまれかどうかという話は必要ないでしょ。
だから、まるで理解できないと書いた。
276NAME IS NULL:2014/03/13(木) 21:33:46.78 ID:???
性別、生年月日なんかも、分けて書いてる教科書もあるけど
↑この教科書とやらがどういうポリシーで分けたかを書かないとどうにもならんよ
277NAME IS NULL:2014/03/13(木) 21:36:48.99 ID:???
>>271,272
韓国では自己申告によって誕生日を変更できるらしい
また、日本でも性別に関して一度だけなら現実に変更は起こりうる
まあ、これらはどちらも極端な例かもしれないがね

それはさておき、会員情報には現実に何度も変更される事を想定すべき項目もある
たとえば郵便番号/住所/電話番号/メールアドレスは引っ越し等で変わる
もしも想定しているサービスがSNS等であるなら、
最新の情報さえDB上に記録されていれば十分かもしれない
しかし、仮にサービスがオンラインショップの会員であり、
過去に遡って全会員を対象にした購買傾向を追跡/分析したいのであれば、
ある会員IDに対する変更履歴情報をDB上に格納する方法も選択肢になる

つまり>>266に対して言いたい事とは、会員情報を実装するのにテーブルが1個ですむのか
複数必要になるのかは、提供しようとするサービスの業務分析によって決まる、ってこと
で、もしも業務分析の初期段階にあって決定できないのなら1個にまとめる
何となく必要になりそうだから...という曖昧な理由による複数テーブル化は、
DB設計に無駄を追加するだけの無益な行為である
278NAME IS NULL:2014/03/13(木) 21:38:05.27 ID:???
>>275
つまり、分割する必要なない、と思ってる、ということでよい?

何だかよく分からん
279NAME IS NULL:2014/03/13(木) 21:42:52.06 ID:???
>>275
会員テーブルにあるパスワードはへんだから別テーブルにしろ、といいたいのか?
それなら>>266にそう言ってやればよろしかろう

俺にも、お前が何を言いたいのか分からん

>>277
これに一票
280266:2014/03/13(木) 21:52:34.35 ID:iuRydHHe
>>277さんの回答を元に質問させていただきますと、
>>266の質問は新規サイトを作る時にいつも悩むのでして、
自分の性格からか、どうしても汎用性の高い仕様にしたく思い、
2つのテーブルに分けています。

しかし、selectする時も面倒くさいし、画面設計も多くなります。
だからと言って、絶対に後からカラムがしないとも言い切れないし、
ECではなく、コミュニティ関係のサイトでも
複数の住所とか画像とか登録したくなるかもしれません。

そんなこんなを考えると、DB設計がなかなかまとまらないんです。
281266:2014/03/13(木) 21:56:14.20 ID:iuRydHHe
ただ、これまで2つに分けて後からプロフィールを追加する事案って
ほぼ無かったように思います。ECサイトは作っていませんが。

だからやっぱり「迷ったら1つにしろ」っていう
>>277さんの意見が正しいんですかね。私自身が心配し過ぎというか・・・
282NAME IS NULL:2014/03/13(木) 22:07:27.12 ID:???
>>280
画面設計が増えるの?
283266:2014/03/13(木) 22:09:51.65 ID:iuRydHHe
>>282
はい。会員情報とプロフィールなら画面が2つ分かれます。
有名所だと、ヤフーもそうだと思います。
284NAME IS NULL:2014/03/13(木) 22:11:07.41 ID:???
>>283
テーブルを分けることとは関係なくない?
285266:2014/03/13(木) 22:12:13.75 ID:iuRydHHe
確かに関係無いですね・・・
286NAME IS NULL:2014/03/13(木) 22:18:38.92 ID:???
そんなことより第二正規形ってそういうもんだっけ?
俺が学んだのと違うな
287NAME IS NULL:2014/03/13(木) 22:29:45.44 ID:???
>>280
迷ったら一つにする、というのは誤りではないが、必ずしも正解でもない
基本通りに分割する、というのも誤りではないが、やはり必ずしも正解でもない

何事にも限度がある
その限度のガイドラインとなるのは、やはり業務と仕様かと

ひとテーブルにまとめるなら、これは分割する必要なさそうだけど、一緒でよい?と、
逆に分割するなら、例えばプロフィールは今後増える?増えるなら分割しないとだぜ?
みたいなことを開発側と練っていって、より正解に近い方を選んでいくもので、
DB担当一人で悩む所ではないかなと

マスターベーション的に分割するという行為には、あまり価値がない
288NAME IS NULL:2014/03/13(木) 22:47:16.13 ID:???
「変更されないから」同じテーブルにおいていいなんて前置きをされたら
変更されるカラムがあるけどそれはいいのか?って思うだけだ。
前置きをするからには何らかの理由があったはずだ。

>>278
分割の必要はないと思ってるよ。
変更されないから同じテーブルに置いていいよという前置きの意味が分からないだけだよ。

>>279
何も変じゃないよ。同じテーブルに置けばよい。
変更されるかどうかなんて気にせず置けばよい。

>>280
クラス分割とテーブル分割を混同してはいけない。
OR/Mによってテーブル設計を縛られてはいけない。
それだけだよ。
289266:2014/03/13(木) 22:50:05.61 ID:iuRydHHe
>>287
相談できる相手がいればいいんですけどね・・。
あまりDB設計の事例ってネット上に無いですし、
どうすれば良いか悩むんですよね・・・。
290NAME IS NULL:2014/03/13(木) 23:22:34.49 ID:???
>>289
定型的にこうすればよい、という手法が無いからね
ネットなりで示される事例というのも、当該の案件ではそうした、というだけであって
どんな場合にも通用するわけじゃないし

抽象的なDB設計手法の情報を得つつ、具体的な案件で活用し、また別の事例を学び、
前回の案件での反省を踏まえて、みたいな手探りの繰り返しで、センスや勘所を
磨いていく、だろうかねぇ

ただベースとなるところは持つべきで、それはDBの基礎知識だったり、DBはどうあるべきか
みたいな思想だったり、無駄や過剰を判断する自分なりの基準だったりして、さ

それはアーキテクチャやNWも同様なのだけれどね
291NAME IS NULL:2014/03/13(木) 23:39:05.90 ID:???
>>277
>過去に遡って全会員を対象にした購買傾向を追跡/分析したいのであれば、
>ある会員IDに対する変更履歴情報をDB上に格納する方法も選択肢になる
>
>つまり>>266に対して言いたい事とは、会員情報を実装するのにテーブルが1個ですむのか
>複数必要になるのかは、提供しようとするサービスの業務分析によって決まる、ってこと
履歴テーブルを追加するかどうかと、会員情報とプロフィールを分けるかどうかは関係ないよね…?
会員情報テーブルに履歴ももたせるという発想は、SNSではあり得ないし。。
292266:2014/03/13(木) 23:59:55.50 ID:iuRydHHe
皆さま。アドバイスありがとうございました。
小規模なサイトなら1テーブルに済ませるように考えたいと思います。
293NAME IS NULL:2014/03/14(金) 00:00:47.83 ID:???
セキュリティの一環で会員情報とプロフ情報を分けるのはありだと思うな。
会員情報を独立させて、暗号化させとけば情報漏えいは減ると思うし。
思想っていうか方針の問題だと思う。
正解はないよね。
294NAME IS NULL:2014/03/14(金) 00:30:43.94 ID:???
元の質問にかかれてないけど、プロフィールが必須かどうかで話は変わるよ。
295NAME IS NULL:2014/03/14(金) 03:02:55.53 ID:???
>>293
それ思想でも方針でも無くて、セキュリティ要件

何らかの要件でわける必要があればわければ良いけど
今回の例でわける必要もメリットもあるようには見えんが
296NAME IS NULL:2014/03/14(金) 15:45:55.14 ID:???
ここも強制IDになればいいのにな。自演臭がひどい
297NAME IS NULL:2014/03/16(日) 05:05:46.88 ID:JOrCCh2Q
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
298NAME IS NULL:2014/04/01(火) 18:57:09.58 ID:uRrxpLcG
http://iup.2ch-library.com/i/i1163452-1396345725.png
ゲームのデータベース作ってるんですが、うまく正規化ができなくて困ってます。

・プレイヤーは1つのチーム編成を持っている
・プレイヤーは複数のキャラクターを持っている
・チーム編成は同じプレイヤーのキャラクターを最大8つ登録できる
・チーム編成の1番目のキャラクターをリーダーとするため、チーム全体の順番を保存したい
・キャラクターは1つのチーム編成にしか登録できない
・キャラクターは1つのチーム編成に1つしか登録できない

パズドラっていうソーシャルゲームのチーム編成っぽい感じです。
どうしたらいいですか?
299NAME IS NULL:2014/04/01(火) 21:45:48.50 ID:???
>>298
> ・キャラクターは1つのチーム編成にしか登録できない
> ・キャラクターは1つのチーム編成に1つしか登録できない

つまりチーム編成とキャラクターは一対多の関係だと言いたいのかな、これ

キャラクターIDが一意なサロゲートキーなのか重複しうる種別IDなのか
曖昧なのが混乱を誘っているように見える

まずは主キーがどれか整理して考えるとこからじゃないかな
300NAME IS NULL:2014/04/01(火) 22:32:06.40 ID:???
>>298
自分には、文章で書かれた要求に従って、適切に設計されているように見える
少なくとも第1/2正規化は満たしているから、
それ以上の正規化にはこだわらなくてもいいのではないかと思う
301NAME IS NULL:2014/04/02(水) 00:43:45.08 ID:???
>>298
キャラクターが複数のチームに登録されてるように見えるよ。
302NAME IS NULL:2014/04/02(水) 11:43:52.19 ID:nZFSMvfa
すいません、チーム編成テーブルの主キーが決まらなくて困ってます
303NAME IS NULL:2014/04/02(水) 12:03:59.63 ID:???
>>302
チーム編成テーブルの主キーは
プレイヤーIDとキャラクターIDでいいんじゃないの?

自分が設計すると、チームを別途に作ってしまうな

> ・キャラクターは1つのチーム編成にしか登録できない
これって必要?結果としては出てくるんだけど、要件なのかなーってね
304NAME IS NULL:2014/04/02(水) 13:07:55.98 ID:???
>>303
>> ・キャラクターは1つのチーム編成にしか登録できない
>これって必要?結果としては出てくるんだけど、要件なのかなーってね
システムの要件としては必要なんだろ
問題はどこまでDB側で保障するかって話
これを保証したいなら、キャラクターテーブルにチーム編成の主キー(ID)持たせろって事になる
同様に
>・プレイヤーは1つのチーム編成を持っている
これも保障したいならプレイヤーテーブルにチーム編成のID持たせる

俺ならこのレイアウトのまま、登録するアプリでチェックするけど
チーム編成の主キーは(プレイヤーID,キャラクターID)か(プレイヤーID,キャラクターID,番号)かだな
305304:2014/04/02(水) 13:14:40.81 ID:???
チーム編成の主キーは(プレイヤーID,キャラクターID)か(プレイヤーID,番号,キャラクターID)かだな
に訂正しとく
306NAME IS NULL:2014/04/02(水) 13:57:02.95 ID:???
>>302
>>299に答えないと進まないと思う。この部分。
> キャラクターIDが一意なサロゲートキーなのか重複しうる種別IDなのか

見た感じ一意なものだと予想してるんだけど。つまりスライムじゃなくスラりんだと。
307NAME IS NULL:2014/04/02(水) 16:03:44.52 ID:???
>>304
> 俺ならこのレイアウトのまま、登録するアプリでチェックするけど

いやー、データベースで一意性制約つけられるスキーマにしたほうがいいって。
308NAME IS NULL:2014/04/02(水) 16:24:39.19 ID:???
>>303
大体同意見。
>自分が設計すると、チームを別途に作ってしまうな
将来的に複数チームを持たせられるようにすることを考えればそうしたくなるね。
ソシャゲだと複数デッキ登録しておける場合が多いし。

>> ・キャラクターは1つのチーム編成にしか登録できない
>これって必要?結果としては出てくるんだけど、要件なのかなーってね
ね。キャラクターが1ユーザにしか紐づかないのであれば、自然と1つのチームにしか登録できないよね。

>>304
>>> ・キャラクターは1つのチーム編成にしか登録できない
>>これって必要?結果としては出てくるんだけど、要件なのかなーってね
(snip)
> これを保証したいなら、キャラクターテーブルにチーム編成の主キー(ID)持たせろって事になる
そうしてもいいし、そうしなくてもいい。すでに保証されてる。

>>・プレイヤーは1つのチーム編成を持っている
>これも保障したいならプレイヤーテーブルにチーム編成のID持たせる
同様。

よって、その制約を守るためにアプリでチェックする内容に変化はないだろう。
何か勘違いしたまま書いたんじゃないかな。
309NAME IS NULL:2014/04/02(水) 16:32:34.21 ID:???
>>299
そうです。
ひとつのチームにキャラクターが複数存在します
ポケモンみたいなイメージです
310NAME IS NULL:2014/04/02(水) 16:35:19.06 ID:???
>>299
キャラクターテーブルはそのまま、レコード一件につきキャラクター一体を表します。
情報量少なくて申し訳ありません。
311NAME IS NULL:2014/04/02(水) 16:42:43.89 ID:???
チームを将来的に複数もてる事を想定した場合、
チームテーブルは

*チームID
*順番
プレイヤーID
キャラクターID

こんな感じで、何人か仰っているように
「一つのチームに同じキャラクターは登録できない」
という条件に絞った方が綺麗に正規化されているのでしょうか
312NAME IS NULL:2014/04/02(水) 16:44:58.34 ID:???
>>311
すいません、間違えました

*プレイヤーID
*チーム番号
*順番
キャラクターID
という感じです
313NAME IS NULL:2014/04/02(水) 16:47:10.43 ID:???
>>311
それは正規化できてないよ。
チームに8キャラクター登録できるということを踏まえると、
ひとつのチームの情報に、プレイヤーIDが繰り返し8回出てくることになるでしょ。
複数チームを想定しつつ、正規化をするなら、

プレイヤー-チーム
*プレイヤーID
*チームID

チーム
*チームID
*順番
キャラクターID

加えて、チームID、キャラクターIDでユニーク制約をつけておけばいいかと。
314NAME IS NULL:2014/04/02(水) 16:53:15.69 ID:???
ついでに書いておくと、データの無駄(重複)を排除するのが正規化の目的。
無駄がなければすっきりする。

その上で、
・チームに所属できるのは8キャラクターまで
・チーム数はひとつのみ
・プレイヤーが所有権を持つキャラクターのみチームに属することができる
という、制約が必要になってくる。
これは、DBMSがもっている制約で行うこともできるが、アプリでもやることがほとんど。
315NAME IS NULL:2014/04/02(水) 17:02:10.65 ID:???
>>312
それでもいい。
316NAME IS NULL:2014/04/02(水) 17:36:20.74 ID:???
>>313
ユニーク制約ってよく分からないんですが、
一意だけどキーにはしないという感じの制約ですか?
317NAME IS NULL:2014/04/02(水) 17:37:20.91 ID:???
>>313
これだと、別のプレイヤーが同じチームを持ってしまいませんか?
318NAME IS NULL:2014/04/02(水) 17:38:12.74 ID:???
>>314
両方野郎と思います!
319NAME IS NULL:2014/04/02(水) 17:49:21.65 ID:???
>>316
ユニークキーといったりもするよ。一意であることを示すものだね。
プライマリキーはそもそもユニーク制約もかねてる。

>>317
持たせようと思えば持たせられるね。
ところでそれは>>312でも同じですね。
320NAME IS NULL:2014/04/02(水) 17:55:00.02 ID:???
ついでに言えば>>312の設計だと
・複数プレイヤーが同じチームを持てる(当然、他人の所持キャラクターを含む)
・順番さえ違えば同じチームに複数の同キャラクターを持てる
みたいな愉快な事になるねw
321NAME IS NULL:2014/04/02(水) 18:01:47.35 ID:???
>>320
二つ目は>>313でも言及してるけど、ユニーク制約で対応だね。
チーム、順番はユニークであるべきだし、
チーム、キャラクターIDもまた、ユニークであるべきだ。
PKだけでは対応できない。

同じ意味で、>>304がプレイヤーID、キャラクターID、番号の3項目をPKにするというのはおかしな話。
322NAME IS NULL:2014/04/02(水) 20:53:31.23 ID:???
>>308
>キャラクターが1ユーザにしか紐づかないのであれば、自然と1つのチームにしか登録できないよね。
キャラクターは他のユーザーのチームに参加できない、という要件を勝手に想定してないか?
323NAME IS NULL:2014/04/02(水) 20:53:34.87 ID:???
>>320
一つ目ってそうなりますか?
キャラクターが、同じテーブル内のレコードで他に存在してはいけない
という制約があるので
「プレイヤー1の1番目のチームの1番目のキャラクターはこれだけだ!」と、特定できる、かつ他のチームにそのキャラクターはいない

となると思ったんですが
324NAME IS NULL:2014/04/02(水) 20:54:39.01 ID:???
>>322
すいません、書き忘れです・・
325322:2014/04/02(水) 20:59:31.50 ID:???
あ、よくみたらそう書いてあったわ
無かった事にしてくれ

個人的には有る程度ゆるく作っとかんと、テーブルレイアウト変えるのは大変
アプリ修正の方が工数が軽いから、チェック類はアプリでやる方が良い場合が多い
と思う
326300:2014/04/02(水) 22:51:12.12 ID:???
>>311,312
まず>>298の単一チーム要求仕様について、
>>300で述べたように、実装設計(論理モデル)としてよく考えてあると思う
ここで、>>298のチーム編成テーブルとは概念モデル(ERモデル)上のリレーションを実装した
いわゆる Junction Table (訳語は結合テーブル、交差テーブル...等々、>>8を参照)であり、
プレイヤーテーブルやキャラクターテーブルのように単独の主キー(PK)を持たず、
代わりにFKの複合キーを主キーとして用いる
また、その具体的な主キーの論理設計については、>>304,305に賛同する

次に複数チーム要求仕様について、
個々のチームを識別できるようにするため単独の主キー(PK)が必要になることから、
概念モデル上では(リレーションではなく)エンティティとして設計しなければならない
この変更に伴い、チーム編成テーブルは(プレイヤーとキャラクターとの間の関係ではなく)
チームとキャラクターとの間の1対n関係へと変更する

これらをまとめたものを以下にアップした
 http://www.h6.dion.ne.jp/~machan/misc/role-playting-game.png

この図の左側にある単一チーム版の設計図については、先に述べたように>>298とは
作図法(=表現方法)が異なるだけで、意味的に同じものになる
327NAME IS NULL:2014/04/02(水) 22:53:02.63 ID:???
>>323
> キャラクターが、同じテーブル内のレコードで他に存在してはいけない
という制約があるので

テーブルにそういう制約があるなら、>>311-312で明記しる
要件とデータ定義をごっちゃにすんな
328NAME IS NULL:2014/04/02(水) 23:18:24.65 ID:???
システムに使われるデータフローというのは全てデータベースのリレーションで管理するものだと思ってたら、
DBを扱うアプリケーション側で制限するのも大丈夫なんですね
業務で使ったことないので勉強になります

>>327
すいません、その後のレスの流れを組んでいただけたのかと思って紛らわしいこと言ってしまいました
329NAME IS NULL:2014/04/02(水) 23:48:12.46 ID:???
>>328
話の発端が分かるよう名前欄に298と入力しとけ
鳥頭の相手をするのも疲れるだろ
330NAME IS NULL:2014/04/02(水) 23:53:15.82 ID:???
>>326
この画像の右下のチーム編成は、
そのチーム内での順番の一意制というのは保証されない?
331298:2014/04/02(水) 23:53:57.86 ID:???
>>329
すいません
332298:2014/04/03(木) 00:03:19.54 ID:???
えーと、

プレイヤーテーブル
*プレイヤーID
プレイヤーネーム

チームテーブル
*チームID
プレイヤーID

チーム編成テーブル
*チームID
*順番
キャラクターID(ユニーク)

キャラクターテーブル
*キャラクターID
プレイヤーID

というので第三正規化まで綺麗に出来てるでしょうか?
順番の8つまで、という制限は無理そうですが。
333300:2014/04/03(木) 00:14:24.80 ID:???
>>330
チーム内での順序の一意性が必要であれば、
(チームID, 番号) というペアに対して一意性制約をかける
334NAME IS NULL:2014/04/03(木) 00:26:58.57 ID:???
>>332
いいんじゃないかな
チームは8人までという制約がどうしても欲しければ
ユーザー定義関数を制約に指定したりトリガーで確認して例外を投げるとかいろいろ考えられるけど、
この辺りはDBMSの実装に依存するんで設計とは別の話になるかな
335NAME IS NULL:2014/04/03(木) 00:48:00.02 ID:???
>>328
いやあ、十分分かるよ。
キャラクターはゲーム中でユニークな存在である、プレイヤーはチームを一つしか持たない、
チームには同一キャラクターを登録できない。
これを総合すれば、チームテーブル全体において、キャラクターがユニークになるのは明白だからね。
これが分からないって言ってる人は少なくとも>>328よりも設計に関する理解度が低いから安心してスルーしていいよ。
336NAME IS NULL:2014/04/03(木) 00:53:25.65 ID:???
>>332
順番の値の範囲が1-8(もしくは0-7)であるような制約を課せばいいよ。
同様に、プレイヤーあたりのチーム数制限もかけられるんだけど、その場合はそのチームテーブルだとちょっと面倒になるね。
*プレイヤーID
*チーム番号
チームID
として、チーム番号に制約をかければ素直にいける。

レイアウトの好みと、制約の容易さは天秤にかけられるもの。
337298:2014/04/03(木) 01:01:15.85 ID:???
ありがとうございます。
大変勉強になりました!
338NAME IS NULL:2014/04/03(木) 01:25:36.44 ID:???
>>329
俺は要件とデータ定義をごっちゃにすんなっつってんの

>>311-312のデータ定義で要件>>298が満たせるか、って突っ込んでんのに
「要件に書いたから分かるだろ」
じゃいかんだろ、ってこと
339NAME IS NULL:2014/04/03(木) 03:39:14.85 ID:???
>>326
複数チーム構成でチームと言うエンティティが必要なのはわかるんだが
単一チームであってもチームと言うエンティティがある方が自然な気がするんだが
複数か単一かの違いは、チームとプレイヤーのリレーションの基数の問題じゃないか?
340NAME IS NULL:2014/04/03(木) 03:57:54.64 ID:???
俺もそう思うよ。
341NAME IS NULL:2014/04/03(木) 04:34:20.68 ID:???
ゲーム開発者が理解に苦しむような制約のあるゲームを、ゲーム利用者がプレイして素朴に楽しめるのだろうか。
342NAME IS NULL:2014/04/03(木) 04:42:16.58 ID:???
どの制約が理解に苦しむものなの?
343300:2014/04/03(木) 23:30:20.92 ID:???
>>339
そう、基数が1で固定のケースが単一チームと考えることもできる

ただしその場合には、チームとプレイヤーという対象物(サブジェクト)は
「必ず」1対1に対応するから、概念モデル(ERモデル)として設計する時には、
どちらか一つを選んでエンティティとして具体化するのが普通じゃないかと思う
別の言い方をすれば、はじめから要求仕様で単体チームと明確になっているのなら、
単体チームとして最適な、最も単純な解を選ぶべきだと考える
(Simple is best とか オッカムの剃刀 みたいな言葉があるよね!)

こうした考え方を元に、プレーヤーをエンティティとして選びチームを捨てるという
判断を下した >>298 の論理設計図が、(単体チーム向けとして)最適解であると考えた
344NAME IS NULL:2014/04/04(金) 00:24:09.39 ID:???
>>343
「必ず」1対1の対応をするんだから分ける必要はない、つまり第三正規形なんていらないってことだよね。
わかるわかる。
345300:2014/04/04(金) 00:34:24.50 ID:???
>>344
そういった推論になってしまうのは、
第三正規形の定義を「正しく」理解していないからだろね
346NAME IS NULL:2014/04/04(金) 00:51:42.00 ID:???
>>343
チームとプレイヤーとは一般的な考えでは異なる概念だから
一つのエンティティとするのはかえってその概念モデルの理解を妨げる気がする

省略できるものすべてを省略するのが必ずしもわかりやすいという事にはならんよ
347300:2014/04/04(金) 01:16:47.18 ID:???
>>346
わかりやすいとは、一言も言っていないけどな

 与えられた問題に対して必要十分かつ最も簡潔な解を選ぶ

ことが望ましい、という意見だよ
348NAME IS NULL:2014/04/04(金) 02:22:50.75 ID:???
>>345
うん。この場合は問題ないね。
もともと第三正規形になっていた。

ところで、>>300
> 少なくとも第1/2正規化は満たしている
これも、少なくともという言葉で濁すのかな。
349NAME IS NULL:2014/04/04(金) 03:05:51.77 ID:???
>>300って前スレあたりで第二正規形を理解してなかった人じゃないの?
で、勉強が終わったからその発言になったんじゃないかな。

今回突っ込みを入れられて第三正規形を勉強したんでしょう。
知ったかぶりの成長が見て取れる良スレ。
350NAME IS NULL:2014/04/04(金) 07:42:09.63 ID:???
そもそも>>298の問題は正規化できていないことでなく、要件が筋が悪いし整理もできていないことだろう

要件をそのまま定義に落とし込むならチーム編成テーブル自体なくていい
●キャラクタテーブルに順番カラムを追加しnullならチーム未所属扱いにする
●その上で{キャラクターID, 順番}の組でユニーク制約を持たせる
 ※nullがユニーク制約の対象になるDBMSもある点には注意
などとすれば>>298に書かれた要件は満たせる

ただ「やっぱりチーム編成は複数持ちたい」的な話が出る可能性は高い
>>298にユニーク制約を加えたりアプリ側でチェックするべきという回答が出たのも、それを見据えたものと思う
351「ガスライティング 集団ストーカー カルト」で検索を!:2014/04/04(金) 14:59:22.62 ID:XdgNP63l
★マインドコントロールの手法★

・沢山の人が偏った意見を一貫して支持する
 偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法

・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
 誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法


↑マスコミや、カルトのネット工作員がやっていること

TVなどが、偏った思想や考え方に染まっているフリや常識が通じないフリをする人間をよく出演させるのは、
カルトよりキチガイに見える人たちを作ることで批判の矛先をカルトから逸らすことが目的。

リアルでもネットでも、偽装左翼は自分たちの主張に正当性がないことを自覚しているのでまともに議論をしようとしないのが特徴。
.........
352NAME IS NULL:2014/04/04(金) 17:59:09.87 ID:???
>>351
これが貼られるタイミングが前スレあたりから興味深い。
やっぱ強制ID必要だわ。
353300:2014/04/04(金) 20:48:09.77 ID:???
>>350
あるチームに所属するキャラクターを未所属(どこのチームにも
所属していない状態)へ変更するには、どのように操作するの?

SQLのUPDATE文では、あるカラムが有効値である時に
それをNULL値へ更新できないと思うんだけど....
354NAME IS NULL:2014/04/04(金) 21:25:33.58 ID:???
>>353
update aaa set bbb = null;
355NAME IS NULL:2014/04/04(金) 22:37:06.16 ID:???
>>300
> SQLのUPDATE文では、あるカラムが有効値である時に
> それをNULL値へ更新できないと思うんだけど....

何をどうがんばっても擁護できないんだけど。
update で値をNULLにできないっていってるよね?
356NAME IS NULL:2014/04/04(金) 22:39:14.09 ID:???
あ、まてよ、oracle信者の可能性があるか?
357300:2014/04/04(金) 23:52:36.29 ID:???
>>354
レスありがと
UPDATE文の右辺式にNULLが書けるとは知らなかった
358NAME IS NULL:2014/04/05(土) 06:51:15.09 ID:???
>>350訂正
> ●その上で{キャラクターID, 順番}の組でユニーク制約を持たせる
{所有プレイヤーID, 順番}の組、と書いたつもりだった、お恥ずかしい
359NAME IS NULL:2014/04/06(日) 18:31:05.21 ID:???
>>357
NULLは式でも値でもない
右辺にかけるのは、(スカラー)式かDEFAULTかNULLって決まってる

つか、今までNULLに更新した事ないのか?
どういう立場でDB使ってるんだ?

>>356
ORACLEはNULLとヌルストリングを区別できないだけで
いくらなんでもUPDATEでNULLにするのは出来るだろ
360NAME IS NULL:2014/04/06(日) 19:51:05.96 ID:???
>>359
ちょっと上のゲーム絡みの書き込み見れば、
このスレのレベルはわかるだろ。
361NAME IS NULL:2014/04/06(日) 19:56:37.84 ID:???
まともな人もいるよ。
一部のレベルの低い人がドヤ顔で語ってるからおかしなことになってるだけ。
さすがにその流れでNULLへ更新できないなんて言いだすとは思わなかったけどな。
362NAME IS NULL:2014/04/07(月) 08:14:34.93 ID:rbRzBkbj
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。ひんがら目気色悪すぎこっち見んな死ね。
363NAME IS NULL:2014/04/20(日) 10:48:47.69 ID:a30yxTYO
狭い範囲にしか影響が出ない場合や、
または、区分しにくいコードに関しても、ソースコードに
直接書き込むのはNG?うちのシステムコード書きまくってます。
364NAME IS NULL:2014/04/20(日) 11:51:05.33 ID:???
リテラルをプログラム中に書きまくるって話?それはプログラミングの話であって設計の話ではないのでは?
365NAME IS NULL:2014/04/20(日) 12:06:45.70 ID:???
>>364
○○コードみたいなやつを条件文に直接書くってこと。そういうのって全て区分にしてDB化しなきゃいけないの?
366NAME IS NULL:2014/04/20(日) 14:12:30.30 ID:???
変動しない性別テーブルなんて要らん
367NAME IS NULL:2014/04/20(日) 15:28:22.36 ID:B7j12JHQ
ある製品を作る
生産システムにおいて
ある工程のみ特殊な処理をしたい。
しかし、pgに行程コードを書くのがngであるなら、
工程マスターに新規区分フィールドを追加することになるが、
その工程を判別するためだけにdb変更がありなのかってこと
368NAME IS NULL:2014/04/20(日) 17:17:35.34 ID:???
その情報をデータとして永続化する必要がないならDBに持たなくて良いんじゃない
369NAME IS NULL:2014/04/20(日) 17:30:14.83 ID:???
画面に表示するメッセージの文面や色、ダイアログのサイズやタイトル、
そういったものまでDBに格納した結果、マスターから1レコード取ってくるだけの処理で
50個とか60個とかSQLが投げられているシステムの事を思い出した
370NAME IS NULL:2014/04/20(日) 18:53:11.19 ID:???
>>367
その条件に別の行程を追加するとき、PGに工程コードを追加するのか、
それともDBに区分フィールドを追加して該当する行程に1を立てるのか?
ポイントは、その条件が、ほかのシステムでも使われうるものなのかどうかということ。
その工程だけ1が立っていてほか全部ゼロのようなものは、
たいてい、狭い範囲でしか使われていない。そんなものは、
PGに持てばいい話。といいたいところだが、ほかの方はどうされているのか知りたい。
どんなケースであれ、直でコードを書くのを避けているのかどうか。
371NAME IS NULL:2014/04/20(日) 20:49:32.05 ID:???
372NAME IS NULL:2014/04/21(月) 04:55:39.17 ID:???
>>370
生産で行う処理が特殊であれ通常であれ、
生産管理システムから見たら同じ処理でしょう
何を迷う事があるんですか
373NAME IS NULL:2014/04/21(月) 12:21:53.45 ID:???
>>370
将来にわたって参照・変更することがないならプログラムに書くかな
374NAME IS NULL:2014/04/22(火) 00:05:13.58 ID:???
>>370
見解ありがとうございました
375NAME IS NULL:2014/04/22(火) 18:26:28.72 ID:???
>>370
> ポイントは、その条件が、ほかのシステムでも使われうるものなのかどうかということ。
そんなの関係ないよ。

ポイントなのは、
* 対象となる工程が変わりうるのか
* 対象となる工程が多いのか少ないのか

今、工程1〜工程100まで工程マスターに登録されてるとして、
「工程4のみ特別な処理をする」という要件があったとき、コードで
if (record.process_id == 'proc4') {
}
みたいなコードで十分なのか、
if (record.is_special_process) {
}
とした方が良いのかという違い。

対象となる工程が変わりうるのなら、データベースにis_special_processカラムを追加するか、
別テーブルを追加すべき。table special_processes (process_id) みたいな。

また、対象となる工程が多い場合も、同様にするのがいい。

対象となる工程が少なく、また今後変わる予定も無い場合に限って、プログラムに埋め込んでも良い。
376NAME IS NULL:2014/04/22(火) 18:44:57.89 ID:???
>>375
対象の工程にフォーカスした場合はそうなるだろうけど
>>370を否定する理由にはならんな

それとも対象の工程だけで考えるべきであり
その場限りの特殊な処理だろうがDBに入れるべきといってるのだろうか
377NAME IS NULL:2014/04/23(水) 03:39:05.33 ID:???
>>375
そのプログラム(システム)以外のところで、特別な処理をする工程を知りたいとなったらどうする?
たとえどんなに対象が少なくて今後変わる予定がなくても、他のシステムでその工程を知りたいなら
プログラム中に埋め込むべきではないだろ

>>368の、データとして永続化する必要
>>370の、ほかのシステムでも使われうるもの
>>373の、参照
これらはすべてそう言う意味だと思うけど
378NAME IS NULL:2014/04/23(水) 06:39:39.46 ID:???
よくありがちなのは特殊と言いつつ、特殊な処理が実はいくつもあったりして、全然特殊じゃなかったりすること。
379NAME IS NULL:2014/04/23(水) 07:34:05.46 ID:???
> そのプログラム(システム)以外のところで、特別な処理をする工程を知りたいとなったらどうする?

それが同一サーバ内のシステムなら、外部設定ファイルに情報を持たせる手も一応はある
あんまりお勧めはできないけど、DB側に情報を持たせられない・持たせたくない事情があるなら
380NAME IS NULL:2014/04/23(水) 09:10:15.12 ID:???
品質管理上、その特殊な処理が入った成果物のロットを明確にしないといけないとか、特殊な処理がいつから導入されていつ終了になったのかとか、後々に問題にならないようなものならいいが。
381NAME IS NULL:2014/04/23(水) 09:22:02.84 ID:???
特殊な処理を例外扱いしないために、
生産(管理)システムを導入するということもあるかと。
382NAME IS NULL:2014/04/23(水) 10:51:43.60 ID:???
>>377
> そのプログラム(システム)以外のところで、特別な処理をする工程を知りたいとなったらどうする?
そうなったら、そうなったときに考えればいいこと。
無限の拡張性を担保して開発することなんかできない。
383NAME IS NULL:2014/04/23(水) 11:30:12.87 ID:???
あるシステムの外部からそのシステムが知っている情報を取得するとき、普通はAPI経由にすると思うけど。
一つのデータベースインスタンスを複数のシステムが共有するのは、最初からそういう前提になって無い場合はほとんどしないんじゃないかな。
384NAME IS NULL:2014/04/23(水) 16:16:13.60 ID:???
>>380
> 品質管理上、その特殊な処理が入った成果物のロットを明確にしないといけないとか、特殊な処理がいつから導入されていつ終了になったのかとか、後々に問題にならないようなものならいいが。

それと、工程コードをハードコーディングしていいかどうかに、何の関連が?
385NAME IS NULL:2014/04/23(水) 19:08:52.29 ID:???
>>384
ハードコーディングするぐらいだから記録もあんまり考えてないのかなと思って。関係ないならすまん。

まあ、この処理は他と比べて特別であるという判断を、誰がどんな根拠でするのかなあ、とは思う、生産システムの例なのでそこは結構気にした方がいいと思うが。
386NAME IS NULL:2014/04/23(水) 21:01:24.29 ID:???
まずは、その特別な処理をカイゼンすることが先じゃないかな
387NAME IS NULL:2014/04/23(水) 22:34:16.62 ID:???
なんでもかんでもDBの区分化したら、
PGが変更されて使わないフィールドが出てきて
あとからなんだこれ?よくわからんが、とりあえず
とっておくか的なゴミフィールドが出てこないか?
388NAME IS NULL:2014/04/24(木) 03:04:14.01 ID:???
実際のDB構造・ER図を見れて参考に出来るサイトをご存じでしたら、教えて頂けませんでしょうか
例えばeccubeのERは少し参考になりました
389NAME IS NULL:2014/04/24(木) 08:45:03.20 ID:???
>>386
モノの生産となると、どうしても外せない特別な工程が出る事もある
390NAME IS NULL:2014/04/24(木) 09:25:23.56 ID:???
>>387
運用次第、水は低きに流れる
391NAME IS NULL:2014/04/24(木) 09:45:45.94 ID:???
>>363,367はアプリケーションの振る舞いを
データベースで制御したいの?したくないの?
その答えだけで決まる話だと思うんですけど
392NAME IS NULL:2014/04/24(木) 16:55:01.43 ID:???
>>391
したいかしたくないかわからないから、普通はどうやんのってのが知りたいんじゃ?
393NAME IS NULL:2014/04/24(木) 17:40:06.15 ID:???
>>392
普通はしたいかしたくないか(必要があるかないか)決めてそれに合わせて考えます
それが設計ってもんですよ
394NAME IS NULL:2014/04/24(木) 18:18:32.20 ID:???
>>392
何をしたいのか判らないものは答えようがないじゃないすかね
どうでもいいけど日本人は普通という単語が好きだよねって話思い出した
395NAME IS NULL:2014/04/25(金) 11:07:43.69 ID:???
>>393
> 普通はしたいかしたくないか(必要があるかないか)決めてそれに合わせて考えます

必要があるのかないのか自分では判断できないから聞いてるんだろ
396NAME IS NULL:2014/04/25(金) 12:44:00.39 ID:???
設計には要件定義ってフェーズが有ってね
自分で判断できないときは、判断できる人に決めてもらうんですよ
397NAME IS NULL:2014/04/25(金) 13:09:43.48 ID:???
ハードコーディングするかどうかは、実装詳細だろ
398NAME IS NULL:2014/04/25(金) 16:11:41.57 ID:???
ていうか、この質問ってDB設計に関係あるんですかね。
399NAME IS NULL:2014/04/25(金) 21:09:49.76 ID:???
「DB設計とは何か?」や「DB設計におけるよくある勘違い」という意味では、
まったく関連が無いとは言えないこともない
400NAME IS NULL:2014/04/26(土) 16:02:14.63 ID:???
・postgres 1.81

http://eow.alc.co.jp/search?q=sort&ref=sa

このような辞書を作りたいのですが、カラムはどのようにわければいいでしょうか?
また、例文は例文で別にストックして表示する形がベストでしょうか?

よろしくお願いします
401NAME IS NULL:2014/04/27(日) 12:58:00.88 ID:???
単語、意味
単語、用例
この二つのテーブルがあれば足りるんじゃ?

あとは、実際に使う上で便宜があるように項目を追加・分離
402NAME IS NULL:2014/04/29(火) 02:49:34.42 ID:ZtWZlvde
403NAME IS NULL:2014/04/29(火) 15:24:48.79 ID:o8Wl779o
Tweetを恣意的にまとめて時系列順で読ませるようなものを作りたいのですが

tweetsテーブル
id
tweet_text
tweet_date

tweet_groupテーブル
id

tweet_group_associationテーブル
tweet_id
tweet_group_id


こんなテーブル設計でいいのでしょうか?
tweet_groupテーブルがほぼ空(強いて言えば名前や読まれた回数ぐらいはつけられるようにするかも)なのが気になるのですが
もっとすっきりとした設計は可能ですか?
404NAME IS NULL:2014/04/29(火) 16:24:47.32 ID:???
何をしたいのか全く分からんが、tweet_groupの価値も分からんね
405NAME IS NULL:2014/04/29(火) 16:41:40.85 ID:???
>>403
・tweet_groupというのが「Tweetを恣意的にまとめ」たもの(=エンティティ)であり、
・あるTweetが複数のグループに所属することを(>>403が)想定している
のであれば、DB設計における最初の出発点としては
そんな感じでいいんじゃないかと
406403:2014/04/29(火) 16:47:04.03 ID:o8Wl779o
Twitterの特定のツィートをまとめたいのですが、
データベース的にどんな風に作ればいいのかってことです。
まとめる方法は完全に手動です。

まとめ(groupとします)とツィートは*対*の関係です。

tweets
id
tweet_text
tweet_date

tweets_group
group_id
tweet_id (tweetsテーブルのidが外部キー)
※group_idとtweet_idで主キー

tweets
| 1 | テストなう |
| 2 | hogeなう |
| 3 | fugaなう |
| 4 | piyoなう |
| 5 | barなう |

tweets_group
| 1| 2 |
| 1| 3 |
| 1| 4 |

こんな風にしたほうがいいのでしょうか?
407NAME IS NULL:2014/04/29(火) 16:47:50.28 ID:???
>>405
ありがとうございます。
とりあえずこれで行ってみます
408NAME IS NULL:2014/04/29(火) 18:07:39.52 ID:???
>>406
>Twitterの特定のツィートをまとめたいのですが、
>データベース的にどんな風に作ればいいのかってことです。

アプリケーションの設計は、大きく「何を作るか」という機能設計と
「どうやって作るか」という実装設計の2つに分類され、
一般には定義した機能(の仕様)を元にして実装方法が決まる
言い換えると、「どうまとめるか」という機能が決まらずに実装が決まることはないし、
「どんな風に作れば」という実装を元に「どうまとめるか」という機能を
検討しようとする試みは、本末転倒だよ

で、ツイートのまとめかたという機能(の仕様)は>>403自身しか知らないし、
それは>>403のアイデアで勝負すべき事柄であり、
もし相談するのならここではなくSNS関連の板が該当する

遠回しな言い方になったけど、あるツイートの集合について、互いに交わらない
部分集合へ分割するのであれば、DBの実装設計としては
>>406の「1対n」方式を選択することになるし、
交わりを許すのであれば>>403の「m対n」方式を選択することになる
で、繰り返しになるけど、その判断は>>403が下すしかない
もしも現時点で機能仕様が決められないなら、個人的には単純な「1対n」を勧める
409NAME IS NULL:2014/05/01(木) 00:54:34.97 ID:???
交わる前提で設計したほうがいいと思うけどな。
異なる観点でまとめることができないなんてことになるし。
410NAME IS NULL:2014/05/01(木) 15:53:40.57 ID:???
>>408
> もしも現時点で機能仕様が決められないなら、個人的には単純な「1対n」を勧める

現時点で決められないのであれば、n:mにするでしょ。
別にそれで特別設計が複雑になるわけではないし、1:nも実現できるし。
411NAME IS NULL:2014/05/01(木) 17:48:24.30 ID:???
いつものあの人でしょ。
経験で学んだらしいが、毎度逆を行くのはどういう経験をつんだらそうなるのか不思議でならない
412NAME IS NULL:2014/05/01(木) 18:22:12.17 ID:???
まあ、ある程度経験のある人間ならn:mで設計しとけばいいんだけど
ここに聞きに来てるような段階のひとなら、なるべく単純な形からやっとけってのは一理あるとはおもう

単純にいくならtweetsテーブルにグループの名前なりIDなりの項目作れば良いんだけどね
413NAME IS NULL:2014/05/02(金) 01:08:39.86 ID:???
>>406って>>403からtweet_groupを取り除いただけだよね
なんで1:nだの言い出したのか判らないな
414NAME IS NULL:2014/05/02(金) 06:00:18.79 ID:???
もともと
> まとめ(groupとします)とツィートは*対*の関係です。
って書いてんのに1:n にしろとかいうのは根本から間違えてるもんね。

車が欲しいんですけど、オススメの車はありますか?→お前に車なんていらない。自転車乗ってればいいんだ。
みたいなイカレ具合だよこれは。
415NAME IS NULL:2014/05/02(金) 07:28:30.51 ID:???
ディーラーは務まらんだろうが、そうでなければ然程不思議な意見でもないな。
416NAME IS NULL:2014/05/02(金) 10:03:25.97 ID:???
何のために車が欲しいのか書いて無ければ自転車も車だ
417NAME IS NULL:2014/05/12(月) 16:50:32.32 ID:iczyP8Po
座席(映画館とかの予約)の管理にDBを使いたいのですが、
どのように設計すればよいかアドバイスをお願いしますm(_ _)m
(当方初心者です)

複数の部屋に座席が多数並んでいるとします。
その座席の空き情報を調べたり、誰が予約しているのかの情報を
管理したいです。

予約時に部屋のマップから座席を指定したいのですが、内部で
キーをどのように持つべきかわかりません。

現在は以下のようなレコードになっています。

座席番号(連番)[key],部屋番号,座席の行番号,座席の列番号,予約者ID

予約したり、位置を特定するのに、毎度、座席位置と座席番号を
変換しているので、この変換なしに部屋番号,座席の行番号,座席の列番号
の一組でキーに設定できないでしょうか?

ご助言、よろしくお願いします。
418NAME IS NULL:2014/05/12(月) 17:08:07.34 ID:???
>>417
まず、座席情報と予約情報は別テーブルにした方がいい。
予約業務は、実際は時刻情報等が必要なのでは?

> 変換しているので、この変換なしに部屋番号,座席の行番号,座席の列番号
の一組でキーに設定できないでしょうか?

「キー」が何を指しているのかわからないけど、なぜ「キー」に設定したいと思ってるの?
419NAME IS NULL:2014/05/12(月) 17:24:38.80 ID:???
>>417
座席位置は、マップで表示する際に必要
マップから座席を選んだときは座席番号さえあればデータは登録可能でしょう。
420NAME IS NULL:2014/05/12(月) 17:26:03.55 ID:???
>>417
部屋番号,座席の行番号,座席の列番号
以上3つがナチュラルキーのようだから、それらを複合主キーにして
座席番号(連番)
を削除すれば>>417の希望は満たせるけど…

上映日時的なカラムがないのが気になるし「座席番号(連番)」が他のテーブルに使われてないかも気がかり
421419:2014/05/12(月) 17:33:32.95 ID:???
座席番号って、そういうことか。>>419は忘れてください。

>>418の時刻情報と、>>420でいいと思う。
422NAME IS NULL:2014/05/12(月) 17:37:23.99 ID:???
「4人並びの席」とかの指定がうまくできるのかな?
423NAME IS NULL:2014/05/12(月) 17:50:38.10 ID:???
>>422
映画館程度の規模でマップから選ぶなら、見た目で判断できるからいいんじゃないかな。
要件的には問題ないというか。
424417:2014/05/12(月) 17:53:57.82 ID:???
みなさん、アドバイスありがとうございます。m(_ _)m

上映時間ごとにテーブルを作っています・・・。
初設計なので、常識を軽々とスルーしているようですね。orz

これから座席のメンテナンス情報(汚れ、故障、等々)を
追加したいと考えているのですが、

部屋番号,座席の行番号,座席の列番号 →座席番号(連番)取得
座席番号→メンテナンス情報取得

の二段階を

部屋番号,座席の行番号,座席の列番号 →メンテナンス情報

にしたいと考えています。

複合主キーという存在を知らなかったので、こういう場合
みなさんはどのように処理しているのか教えて頂きたかったのです。

> 4人並びの席

そのあたりはプログラム側で処理して、DBには同一の予約者IDを
書き込んでいます・・・。
425418:2014/05/12(月) 18:06:17.68 ID:???
>>424
俺の質問は無視か・・・

てか、JOINは知ってるのか?

> 上映時間ごとにテーブルを作っています・・・。

それは、ある映画館に3部屋あって、それぞれの部屋で毎日4回上映する場合、
毎日12回のCREATE TABLEをやってるという意味か?
426NAME IS NULL:2014/05/12(月) 18:07:40.05 ID:???
まあ部屋情報の上に館情報もあったほうがいいけどな
座席は行と列、アイルの情報があるし、欠番の席もあるから
固定の座席テーブルから、売り出し用のテーブルにidのみ転記、そっちで
独自にidをつけて予約、発券に使うのがよさそうな。
427418:2014/05/12(月) 18:10:54.72 ID:???
俺の勘だが、まずこれ読んだほうが話が早いと思うぞ。

『達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ』
http://www.amazon.co.jp/dp/4798124702

『達人に学ぶ SQL徹底指南書』
http://www.amazon.co.jp/dp/4798115169
428417:2014/05/12(月) 19:09:52.33 ID:???
>>425
すみません、見落としてしまいました。

> 予約業務は、実際は時刻情報等が必要なのでは?

一日の上映回数は決まっているので、その時刻ごとに
テーブルを作ってました

> なぜ「キー」に設定したいと思ってるの?

座席番号はDB上にのみ存在していて、データを一意に識別するときには
必ず部屋番号、列、行番号を使っているので、それを直接キーにしたいと
思いました。

*キーによるレコード選択はO(1)で、条件文を使った選択は
O(n) or O(log N) のように処理に時間がかかるのではないかと勝手に
思っています。

> JOINは知ってるのか?

知りません・・・

> 毎日12回のCREATE TABLEをやってるという意味か?

はい・・・

>>426

今は一館だけですが、将来的には必要になるかもしれません。

> 固定の座席テーブルから、売り出し用のテーブルにidのみ転記、そっちで
> 独自にidをつけて予約、発券に使うのがよさそうな。

なるほど。メンテナンス情報はそういう風にできるか検討してみます。

>>427

自分でも現状の知識ではかなり無理があると思っています。 orz
とりあえずご紹介いただいた本を読んでみます。
429NAME IS NULL:2014/05/12(月) 19:46:07.47 ID:???
>> JOINは知ってるのか?
>知りません・・・

おーい w せめてせめて基本的なことぐらい知ってからにしようよ
430NAME IS NULL:2014/05/12(月) 20:56:06.04 ID:???
課題ならいいけど、業務だったら怖え。
431NAME IS NULL:2014/05/12(月) 21:01:22.09 ID:???
会議室予約とか、貸出予約とかのサンプルどっかに転がってないか
それみて応用すればいいんじゃね
432NAME IS NULL:2014/05/12(月) 21:14:21.50 ID:???
多分なまじっかコードが書けるんで、DB設計は壊滅的なのにシステム全体では一応動くものが作れちゃうパターンだな

そもそもDBMSとは何ぞやというレベルから勉強して設計を1からやり直さないと、にっちもさっちも行かなくなりそう
433NAME IS NULL:2014/05/12(月) 22:03:14.57 ID:???
だれもが通る道。早いうちに痛い目あった方が後々よい
434NAME IS NULL:2014/05/12(月) 23:36:49.77 ID:???
て言うか、今はどうやってるのよ?
メンテ情報とか、連座の扱いとか、VIP 席とか身障者の方の席とかの対応とか、まず何をしたいかを決めた方がいいと思うよ。
435NAME IS NULL:2014/05/13(火) 09:34:29.15 ID:???
学校の宿題か情報処理の自習問題だろ
436NAME IS NULL:2014/05/13(火) 10:04:13.79 ID:???
そうであることを切に祈る
437NAME IS NULL:2014/05/15(木) 14:45:01.25 ID:???
JOINってもう使わないな
438NAME IS NULL:2014/05/15(木) 14:52:54.37 ID:???
    / ̄ ̄ヽ  ┏┓
   / (●) ..(● ┏┛
   |   'ー=‐' i  ・
    >     く
 _/ ,/⌒)、,ヽ_
   ヽ、_/~ヽ、__)  \
439NAME IS NULL:2014/05/15(木) 19:04:14.49 ID:???
あなたはまだJOINを使っている人?
440NAME IS NULL:2014/05/15(木) 19:06:49.11 ID:???
RDBやめたか
441NAME IS NULL:2014/05/15(木) 20:26:10.54 ID:ofSwoAje
NHK質問操縦状回答問題

NHK質問操縦状回答問題

NHK質問操縦状回答問題
442NAME IS NULL:2014/05/15(木) 21:53:18.82 ID:???
NoSQLの感想をどうぞ
443NAME IS NULL:2014/05/20(火) 15:21:27.68 ID:9GXuUkHf
カテゴリなど複数登録があるテーブルで
デフォルト(初期状態)示すカラム名って、何が適切ですかね?
default で良いですかね?
444NAME IS NULL:2014/05/20(火) 18:22:42.07 ID:???
カテゴリが何も設定されてない状態がデフォルトなんじゃないの?
それとも内容ごとに初期値が存在しうるのかな。
445443:2014/05/20(火) 19:35:22.53 ID:???
>>444
例えば学校の部活をカテゴリとして、
「野球部、サッカー部、写真部」に所属しているとします。
その場合、メインの部活は野球部であり、他は違うよ
っといった見せ方をしたのです。

要は複数カテゴリからメインのカテゴリ、メインじゃないカテゴリを
指定できて、後に変更できるといった仕様です。
446NAME IS NULL:2014/05/20(火) 19:36:58.57 ID:???
>>445
primaryとかつけたいところ
447NAME IS NULL:2014/05/20(火) 21:53:08.07 ID:???
メインフラグじゃだめかな
448NAME IS NULL:2014/05/21(水) 00:52:33.64 ID:???
そのものズバリで MainCategory じゃダメなのか?
449443:2014/05/21(水) 09:51:23.94 ID:???
>>448
ユーザーが選択するテーブルを2つに分けろということですか?
確かに正規化されている気はしますが、どうなんですかね・・・

#category
id|name|sort

#main_category
id|category_id|user_id

#sub_category
id|category_id|user_id
450443:2014/05/21(水) 09:54:55.07 ID:???
ちなみに自分は↓こんな感じのテーブル構成を考えており、
defaultの部分がメインフラグ扱いなのですが、
カラム名は違うほうがいいのではないか?と思い、質問しています。

#user_category
id|category_id|user_id|default
451NAME IS NULL:2014/05/21(水) 10:53:09.47 ID:???
>>450
そのdefaultというカラム名を
primary
main_flag
main_category
とかにしたらって返信だと思うよ

ただ、primaryとdefaultはSQLで利用される言葉だから避けることをオススメするよ
primaryはprimary_flagにするとかな

defaultは意味が違うんじゃないかな?
入力等がないときに使われるあらかじめ用意しておく値って意味だからね
452NAME IS NULL:2014/05/21(水) 12:12:49.78 ID:???
そもそもの設計に疑問があるんだけど

・ユーザテーブル
ユーザID, …

・ユーザ/カテゴリ中間テーブル
ユーザID, カテゴリID, メインカテゴリフラグ, …

みたいにテーブルを分けた方が良くない?
453NAME IS NULL:2014/05/21(水) 12:15:58.31 ID:???
ごめん、リロードしてなかった
454443:2014/05/21(水) 12:18:29.63 ID:???
>>451
なるほど。分かりやすく説明していただきありがとうございます。
とりあえず、defaultは駄目かな?と疑問に思ってたので、
教えていただき助かりました。main_flagかmain_categoryにします。
455NAME IS NULL:2014/06/20(金) 01:21:01.61 ID:???
簡易的なブログを運営しています
投稿タイトルや日時、本文をpostsテーブルに持たせて
投稿カテゴリーについてはcategoriesテーブルに持たせて外部キーpost_idで結んでいます

質問なのですが、複数のブログを運営する場合にはテーブル設計はどうするのがいいでしょうか
新たにblogsテーブルを作成し、blog_idをpostsテーブル、categoriesテーブルに持たせたらいいんでしょうか
それともブログごとにテーブルを作るのがいいんでしょうか
うまいやり方があれば教えていただきたいです
よろしくお願いします
456NAME IS NULL:2014/06/20(金) 04:37:15.15 ID:???
>>455
wordpressが別テーブルにしてるところから判断すると別テーブルが正解。

別テーブルにしておくと、ブログの追加、削除が簡単。
457NAME IS NULL:2014/06/20(金) 09:12:54.86 ID:???
その複数のブログとやらが、どの程度の関連性をもつのか考えんことには何とも言えん
個人的には別テーブルは無いんじゃないかな
別DBにするか、単一テーブルでブログIDとかサイトIDとか持つか、どっちかじゃない?
458NAME IS NULL:2014/06/20(金) 09:18:47.55 ID:???
ああ、捕捉しとくけど、別DBって考え方はDBMSによって微妙に変わる
別インスタンスだったり、別スキーマだったり
つまり、同一テーブル名称だけど別のものってことね
少なくとも別テーブル名で同じテーブルデータ持つのはないだろって話
459NAME IS NULL:2014/06/20(金) 09:53:44.10 ID:???
WordPressってサイトテーブルにレコードを追加して
そのサイトIDを含んだテーブル群を別途作成するのか
こんなのメンテナンスしたくないぜ
460NAME IS NULL:2014/06/21(土) 00:03:23.07 ID:4Orq4nTs
メンテナンスしたくない気持ち半分、メンテしやすいと思う気持ち半分。
管理ツールがちゃんとしてれば後者。

別スキーマのほうがもっとよかった。
461NAME IS NULL:2014/06/21(土) 03:04:17.33 ID:???
ブログごとにテーブルって事は、データ増えるたびにテーブル作れって意見と同じじゃないか

少なくともプログラムでまずテーブル名取得してからSQL組み立てとかやりたくねぇ
462NAME IS NULL:2014/06/21(土) 08:10:49.62 ID:???
不特定多数にブログを開設させるようなのでない限りは
スキーマ方式が良いと思う
wordpressみたいな方式はパス
463455:2014/06/21(土) 15:47:17.22 ID:KVSVdrTZ
テーブルを作るのはよくないようですね
DBを分ける方式を採用することにしました
ありがとうございました
464NAME IS NULL:2014/06/21(土) 22:46:30.00 ID:???
そんでDBリンクとか使い出しちゃうんだろうな
465NAME IS NULL:2014/06/22(日) 00:26:57.60 ID:???
>>463
スキーマ単位だろうがテーブル単位だろうが
やってる事は同じコピペなんだよね
> 新たにblogsテーブルを作成し、blog_idをpostsテーブル、categoriesテーブルに持たせたらいいんでしょうか
工数が取れないとかじゃない限りこっちが無難よ
466NAME IS NULL:2014/06/22(日) 06:49:37.84 ID:9FaJOsP1
◎2chスレッド勢いランキングサイトリスト◎

★+ニュース板
・ 2NN (推奨サイト)
・ 2chTimes
★+ニュース板新着
・ 2NN新着
・ Headline BBY
・ unker Headline
★+ニュース板その他
・ Desktop2ch
・ 記者別一覧
★全板
・ 全板縦断勢いランキング (推奨サイト)
・ スレッドランキング総合ランキング
・ ログ速
★全板実況込み
・ 2勢 (推奨サイト)
・ READ2CH
・ i-ikioi

※ 要タイトル検索
※ 2chブラウザ併用推奨
467NAME IS NULL:2014/06/23(月) 01:59:43.21 ID:???
>>455
複数ブログに共通の記事があるのなら同一テーブル。
そうでないなら別テーブル?
468NAME IS NULL:2014/06/23(月) 10:23:15.43 ID:???
運用中にCREATE TABLEやらDROP TABLEが出てくるのはどーもなー
同じカラムならまとめりゃいいじゃん
469NAME IS NULL:2014/06/23(月) 10:28:15.72 ID:???
>>468
妙なこだわり持ってるね
470NAME IS NULL:2014/06/23(月) 10:40:36.51 ID:???
明らかに設計ミスだからな
471NAME IS NULL:2014/06/23(月) 10:50:50.35 ID:???
運用中にCREATE TABLEなんて普通にやってることだから気にならない
472NAME IS NULL:2014/06/23(月) 14:22:37.88 ID:???
プログラムが自動でテーブル作りまくるのか
管理ツールでもないのに
473NAME IS NULL:2014/06/23(月) 14:23:48.39 ID:???
DB慣れてないとどうしてもそうなるのはしょうがない。
474NAME IS NULL:2014/06/23(月) 14:45:53.57 ID:???
分割とかしてたら普通だろ

その規模までいってないだけか
475NAME IS NULL:2014/06/23(月) 16:13:14.15 ID:???
オレオレ原理主義の人来てるな

要件次第だよ
476NAME IS NULL:2014/06/23(月) 21:45:48.58 ID:???
結論としては、運用を想像できない素人達が無知を晒したでFA?
477NAME IS NULL:2014/06/23(月) 21:58:57.55 ID:???
構成管理とか統計情報取得とかをしないんなら、別にいいんじゃないのかな

モノによっちゃ、しないしな
478NAME IS NULL:2014/06/24(火) 01:06:01.11 ID:???
Ruby on Railとか使ってると、宗教戦争になっちゃうんだけど。

俺は業務にあった、DB設計にすべきだと思うんだけど、
Railsだとこうだからといって、無駄な外部キーを増やしたがる。
479NAME IS NULL:2014/06/24(火) 03:45:04.62 ID:tUTXA4Xl
業務を遂行するために選んだフレームワークで使いやすい形にするのは、業務にあったDB設計にあらずってこと?

なんかもぞもぞする言い回しなんだけど、単にRoR嫌いって言いたいだけなのかな。
480NAME IS NULL:2014/06/24(火) 04:13:12.20 ID:???
いるんだよね
理想を追い求めてフレームワークから脱線したがる人
481NAME IS NULL:2014/06/24(火) 04:16:32.55 ID:???
俺も反論するレス書こうとして何回も見てたら

他のフレームワークでこういう設計だからと言う理由で
(フレームワーク使いもしないのに)本来の設計を捻じ曲げるやつがいる

という主張じゃないかと思い始めた
482NAME IS NULL:2014/06/24(火) 04:22:12.86 ID:tUTXA4Xl
> (フレームワーク使いもしないのに)
あぁー。そこまでは気が回らなかったです。それなら納得。
483NAME IS NULL:2014/06/24(火) 07:17:17.12 ID:???
>>478
それは使っている(使えている)とは言えないのでは…
484NAME IS NULL:2014/06/24(火) 11:51:01.06 ID:???
>>476
ないわぁ

要件次第
485NAME IS NULL:2014/07/11(金) 09:21:57.34 ID:???
1時から2時の間に太郎君が学校で死にました
という文があるじゃないですか。
これみたいな沢山の文をデータベースにしたいんですけど
どうゆう構造で保存したらいいとかが分かる本教えてください。
これから太郎君は3時に死んでいるかとか、
太郎くんが1時から2時の間にどこにいるかを
調べられるようにしたいです。
486NAME IS NULL:2014/07/11(金) 14:11:16.23 ID:???
例文が物騒だなw
487NAME IS NULL:2014/07/11(金) 14:15:17.26 ID:???
ミステリーの謎解きか設定考えるのに使うんかねw
488NAME IS NULL:2014/07/11(金) 17:52:09.72 ID:???
RDBよりPrologとかの出番かも
489NAME IS NULL:2014/07/11(金) 20:52:09.55 ID:???
ミステリの粗探しなら、Excelに
「いつ」「だれが」「どこで」「何をした」
をダラダラ入力して、並べ替え・オートフィルタでよくね?
490NAME IS NULL:2014/07/11(金) 20:53:59.03 ID:SfLsxBaO
まぁ、その項目をカラムにすればいいと思うんだけどね。
491NAME IS NULL:2014/07/12(土) 08:59:55.84 ID:???
自然言語の解析やりたいって話の気もするけど
それに応じたデータベースってのは有るんだろうけど、それ用の所で聞いてくれって感じだな
492NAME IS NULL:2014/07/12(土) 09:29:18.08 ID:???
やりたいことは>>489だと思うしDBに落とし込む価値も有りそうだけど、もう少し要件の説明が欲しいな

参考書に関しては、まず適当な入門書でも買ってRDBMSの基礎を学んでみるところからかな
基礎知識がついたら試しに要件と自分の考えた設計をここに晒してみるといいと思う
493NAME IS NULL:2014/07/12(土) 10:18:13.14 ID:???
住人にRDBMSを扱ってる人間が多いとは思うが、別にRDBMSに閉じたスレでもなかろう

つっても、たとえば全文検索の考え方なら実現できそうかどうか、みたいなのは
俺には分からんが
とはいえプリプロセッシングとしての、自然言語解析がキモっぽい気もする
494NAME IS NULL:2014/07/12(土) 17:45:18.39 ID:???
>>493
そもそもスレタイ的にはまずDB設計ありきだし、>>485のやりたいことも
小説をそのまま読み込ませて話を時系列に並べさせたいとかではなくて
「いつ誰がどこでどうした」
というのを手入力して、人物や場所別に出来事を時系列順に並べたい、とかいうもののような気がする

小説丸々食わす方向も面白そうだけど
495NAME IS NULL:2014/07/15(火) 22:34:20.78 ID:E2UqVvuO
id 名前 趣味

上のようなテーブルがあって、趣味の値は複数あります。
こういうときはどんなデータ構造にすればいいのでしょうか?

趣味テーブル作るのはださいと思うので、
他の方法を教えてください
496NAME IS NULL:2014/07/15(火) 22:46:01.11 ID:???
IDテーブル(ID, 名前)
趣味テーブル(ID, 趣味1, 趣味2, &#8226;&#8226;&#8226;)
497NAME IS NULL:2014/07/15(火) 23:00:37.00 ID:E2UqVvuO
やっぱ

1 山田 [野球][音楽]
こういうDBがスマートそうですね
498NAME IS NULL:2014/07/15(火) 23:23:59.24 ID:???
SQL99で定義されてる配列型でも使えば
499NAME IS NULL:2014/07/15(火) 23:48:36.53 ID:???
でもなんか列数増えるの嫌だわ
500NAME IS NULL:2014/07/16(水) 01:30:25.91 ID:???
>>495
ダサい格好いいといった感覚論でなく、具体的に正規化を崩すメリット・デメリットを自分で挙げてみれ
アプリ側の仕様によってはDB側の正規化を崩すメリットが勝るケースもあるが、そのケースに該当するか?
501NAME IS NULL:2014/07/16(水) 01:45:35.25 ID:???
>>495
趣味の正規化というか分類をどうする?
502NAME IS NULL:2014/07/16(水) 01:54:37.84 ID:???
>>495
そのまま

id 名前 趣味
----------------
1 鈴木 野球
1 鈴木 ホッケー
2 田中 野球
2 田中 剣道

って入れていくのが今時のDBっぽいよ
503NAME IS NULL:2014/07/16(水) 03:45:24.46 ID:???
だったらいっそidもいらんだろ
なんのidかは知らんが
504NAME IS NULL:2014/07/16(水) 03:46:29.94 ID:???
タグ管理とかだと、マスタ化しないこともあるね。
趣味をどういう風に扱いたいか次第だなぁ。

特に理由がないなら、ここにいる人たちは口をそろえて正規化しろって言って終わる話。
505NAME IS NULL:2014/07/16(水) 03:48:07.94 ID:???
ユーザIDにしか見えないけど、なんで名前持ってんだろ
今時は難しいなぁ
506NAME IS NULL:2014/07/16(水) 10:49:20.98 ID:???
サロゲートキーがついてるほうがマシだった
507NAME IS NULL:2014/07/16(水) 16:53:31.67 ID:???
マイナンバー実装はよ
508NAME IS NULL:2014/07/16(水) 20:58:42.08 ID:tc/eB9a4
495 です。

ゲームを作っていて、あらゆる属性で効力など絞り込みたいです。


趣味はアイデンティティの一つであり、
名前などと同じように扱うべきです。
そういった観点からいうと、
役割の同じものを別テーブルに書き出すのは間違ってると思いますし、
正規化とは言えないと思います。
規格化と言うべきではないでしょうか。

ということで、タグ管理がイメージに近いと思いました。

こういった感じでしょうか?
id 属性 値
1 名前 鈴木
1 仕事 野球
1 仕事 俳優
1 ポジション ライト
1 打順 1番

更には、野球クラスのサブ属性といったものも同じレベルで扱いたいです。
509NAME IS NULL:2014/07/16(水) 22:21:16.67 ID:???
森羅万象テーブルとかいう話があったの思い出した
510NAME IS NULL:2014/07/16(水) 22:39:11.59 ID:???
>>508
いっそNoSQLの方向に進む方が幸せになれるかもね
511NAME IS NULL:2014/07/16(水) 22:47:23.13 ID:???
そのidってなんなんだろうな。その属性のいずれとも1対1の関係にないものなんだろうし。
512NAME IS NULL:2014/07/16(水) 22:59:46.22 ID:tc/eB9a4
1というものがなんなのか判別するために
アイデンティテイがあると思うんだけど

クイズみたいなもんだよ、
人物1を当ててください。
ヒント
打順は1番、ポジションはライト、野球選手

こういうことを言ってるんじゃなくて??
513NAME IS NULL:2014/07/16(水) 23:08:28.40 ID:???
>>508
主張の内容はよく理解できないけど、確固たるポリシーがあるならそれに従ってやればいいんじゃね?
514NAME IS NULL:2014/07/16(水) 23:20:46.66 ID:???
流石に釣り針が太すぎて、あんまり絡む気が起きんな

>>511
{id,属性}の複合キーといったところだろう
table名を森羅万象とすると、これで鈴木の諸々のデータが取れる寸法

SELECT * FROM 森羅万象 WHERE id IN
(SELECT id FROM 森羅万象 WHERE 属性 = '名前' AND 値 = '鈴木')

森羅万象テーブルのメリットデメリットは各々考えてくれ
ネタでなくこういう設計やる奴もいるのがなんとも…
515NAME IS NULL:2014/07/16(水) 23:23:52.20 ID:???
って同id同属性のレコードもあるのか
516NAME IS NULL:2014/07/16(水) 23:51:18.63 ID:tc/eB9a4
あ、欠陥があった
属性オブジェクトを識別するもの入れてなかった。

idとは(これでは属オブジェクトハッシュコード)
select * from 従属オブジェクト = 1 で得られる結果と
同じ属性プロパティを持ったオブジェクトです

属性ハッシュコード  属性 値 従属オブジェクトハッシュコード
1 名前 鈴木 1
2 仕事 野球 1
3 仕事 俳優 1
4 ポジション ライト 1
5 打順 1番 1
517NAME IS NULL:2014/07/16(水) 23:53:36.03 ID:???
欠陥があるとすれば君の発想の根本に欠陥があるんだよ、というながれ。
518NAME IS NULL:2014/07/16(水) 23:57:15.11 ID:tc/eB9a4
値以外は、実態がオブジェクトで格納されているということです。
519NAME IS NULL:2014/07/17(木) 00:00:46.22 ID:r/KRisL/
いや、違かった

属性オブジェクトは
自分自身のハッシュコード、自分自身の属性の名前、自分自身の値、元のオブジェクトを
データベース上では返すということです
520NAME IS NULL:2014/07/17(木) 00:07:04.16 ID:???
格納する属性をユーザーに決めさせるようなシステムならこういう設計もありだわな
例えば Trac (BTS) のカスタムチケットとかで使われてるよ
521NAME IS NULL:2014/07/17(木) 00:38:06.10 ID:r/KRisL/
ありと言ってもらえて自信つきました。
ちょっとこれでやってみます。
522NAME IS NULL:2014/07/17(木) 01:01:10.00 ID:???
でもそうとは思えないんだよね。
実際にどういうデータを入れようとしているのか。
ゲームの属性や効力について、悪く言えばまとまりのない、良く言えば自由度の高い構成にする理由が思いつかん。

RPGツクールみたいなものを作ろうとしてるとしても、属性マスタを作ったほうがいいと思うんだが。
ユニーク属性ばかりにするつもりなんだろうか。
523NAME IS NULL:2014/07/17(木) 01:01:36.51 ID:???
うおー。時間が二進数や。
524NAME IS NULL:2014/07/17(木) 01:17:20.87 ID:???
趣味と名前がホントに(属性という)同一の扱いでいいならアリだろうけど
>野球クラスのサブ属性といったものも同じレベルで扱いたいです
「サブ」属性なのに同じレベルで扱うのはおかしくないか?
サブ属性とメイン属性は何がどう違うのか表現できなければ、サブとメインの区別が無いのと同じだぞ
525NAME IS NULL:2014/07/17(木) 01:46:21.34 ID:r/KRisL/
作るのはカードゲームです。
今回考えたデータベースを扱うのは、エディターでなくゲームで使います。

マスタは作りません。全てオブジェクトで管理します。

サブの利用頻度は少ないと思いますが、
野球選手のモテ度を5アップとか、
打順一番の打者は先頭打者ホームランを打ちますとか
そういった魔法も作るかもしれないので。
526NAME IS NULL:2014/07/17(木) 01:49:49.37 ID:r/KRisL/
もちろん、デッキエディターなんかは
従来の構造で十分なのでそれで作ります。
527NAME IS NULL:2014/07/17(木) 03:24:11.30 ID:???
ソシャゲのカードゲームにおける、アビリティのようなものを想像するのは間違いってことでいいんだよね。
528NAME IS NULL:2014/07/17(木) 08:44:05.46 ID:???
名前とかHPとか基本的な(どのモンスターでも大体持つ)属性は
きちんとカラムに持たせたり、それがジョブみたいに複数あるものなら
関連テーブルを持たせたりと、RDBの王道を行く方がよい

その設計では、HPがなかったり複数あったり「HP:田中」だったり
間違えてHPじゃなくてHDを持ってたりと滅茶苦茶できるから
アプリ側で登録更新削除時の整合性チェック、及び検索時の異常データに
対する例外処理を手厚くする必要が出てきて、面倒なことこの上ない
DB管理上もデータの見通しが悪すぎるし

特定のモンスターしか持たない特殊パラメータだけ例外的に
・モンスターテーブル
・特殊パラメータテーブル
・上2つの関連テーブル
みたいな形で持たせるのはアリだと思うけどね
529NAME IS NULL:2014/07/17(木) 11:49:48.12 ID:???
いっぱい指摘されてるように典型的なEAVパターンじゃないか。
RDBのアンチパターンまっしぐらよりは、
MongoDBとか使った方が幸せになれるんじゃないかね。
530NAME IS NULL:2014/07/17(木) 14:03:26.43 ID:???
>>525
追加要素の多いカードバトル物のパターンだね

例に挙げたような魔法を作るとなると、その打順がどうかといった制御はアプリケーション側で
実装するのだろう
であれば、データベースには必要な情報を積み上げていくに留め、積み上げられたデータから
モテ度なり打順なりの有無を拾っていった方が良い

見返してみると >>502 が正解かな
531NAME IS NULL:2014/07/17(木) 18:02:02.16 ID:???
RDBは継承は得意じゃないし、そもそもRDBを使わないのも一つの手

カードゲームなら用途的に1000も種類があれば相当多い部類だろうけど
それぐらいのオーダのデータ量ならxmlで持っても問題なかろう
532NAME IS NULL:2014/07/17(木) 21:01:38.12 ID:r/KRisL/
>>528
すいません。
何度も言うように、実態はオブジェクトですので
HPに田中が入ることはありません。
レコードの更新はテーブルじゃなく、オブジェクトに行うものなので。
このテーブルはフィルタさえかかればいいのです。
RDBとは違うものだと思います。

また、HPを二つ持つことも全然ありです。
このモンスターにHP10を追加する。
追加したHPは元のHPと別に扱い、
このHPが全部消滅した時にこのモンスターは死ぬとか
プログラムの仕様を説明すればいいです。
構想上はこんな感じの仕様で動きます。

また、許さない場合もデータベースやオブジェクトが判断しなくとも、
私が作らなければいいだけの話です。

プログラムエラーで動かないようなら意味ないので制限しますけども。
533NAME IS NULL:2014/07/17(木) 21:32:04.62 ID:???
構想が原因でプログラムエラーになることはないから、その構想でも動くと思うよ。
ただめんどくさいだけだね。
オブジェクトとしても気持ち悪いものに仕上がる。
534NAME IS NULL:2014/07/17(木) 22:31:17.97 ID:???
全部一人で作るつもりなら、もう好きにしろよって感じだな
ただ、自分がアプリ担当でこんなクソ設計を上げてくる奴がいたらグーで殴るわ
535NAME IS NULL:2014/07/17(木) 22:33:05.75 ID:???
>>532
そういう自由度を求めるなら、>>530のする通りで、>>502のパターンが適している。
536NAME IS NULL:2014/07/17(木) 22:38:08.02 ID:???
>>532
DBを単なるデータストアとしてしか使わないなら、設計に悩む必要はないよ
オブジェクトと相互変換しやすいようにやれば良い

DBMSの基本的な考え方として、データの整合性はDBMSで保障するってのがある
DBMSの設計論はほとんどその考えを踏襲してる
その保障がいらないならほとんどの設計論は意味ないから
537NAME IS NULL:2014/07/17(木) 22:52:11.55 ID:???
>>534
もちろん後者。

> プログラムの仕様を説明すればいいです。
> 構想上はこんな感じの仕様で動きます。

> 私が作らなければいいだけの話です。
538NAME IS NULL:2014/07/17(木) 23:01:57.62 ID:r/KRisL/
>>536
だから保障されてるってオブジェクトしかいじらないんだから。
539NAME IS NULL:2014/07/17(木) 23:21:03.50 ID:???
>>538
だから好きにしろって
もうここに来る必要もないし、レスする必要もないから
540NAME IS NULL:2014/07/17(木) 23:35:54.05 ID:???
まぁ、ひどい失敗をして学ぶのもいい経験だと思う。
問題は、プログラミングに関する素養がなさそうなところ。
失敗していることに気づかない可能性がある。
541NAME IS NULL:2014/07/17(木) 23:37:21.73 ID:r/KRisL/
おまえさ、知識が足りないからって捨て言葉吐くなよ。
勉強しろよ。
542NAME IS NULL:2014/07/17(木) 23:38:29.41 ID:???
他のスレとは違って忍耐強い人多いから、うまく荒れなくても泣かないでね
543NAME IS NULL:2014/07/17(木) 23:46:24.45 ID:r/KRisL/
ごめん。理解してもえなくて腹たった。
とりあえず、シコシコ作ってみるわ。
544NAME IS NULL:2014/07/17(木) 23:51:11.04 ID:???
実行時まで追加するものの種別がわからんなら、この手の設計にするしかないだろ
おかしいと言うなら、まともな設計と言うものを示してよ
545NAME IS NULL:2014/07/17(木) 23:56:47.30 ID:r/KRisL/
やることはいたってシンプルではあるが口で言うと複雑なので、
まぁ実物をみてもらうしかないですわ。
とりあえず、この仕組みでトランプ作ってみますよっと。
546NAME IS NULL:2014/07/18(金) 01:09:07.72 ID:???
煽りとかじゃなくてDBMS使わないってのも一つの手だぜ、本当に
カードの種類は数万にも達しない上に例外的なパラメータも多いと、そもそもDBMSの強みが活かし辛いケースだし
547NAME IS NULL:2014/07/18(金) 01:27:07.68 ID:???
>>546
そういうこともあって、近頃のネトゲでは>>502みたいなのが主流

ああいったネトゲでは、業務ロジックというかゲームのルールというか仕様というかが、
RDBMS的な思想に基づく、例えば制約やキーによる実現がかえって非効率になっており、
その上でこと細かい制御が必要になるのだから、アプリケーション側をスケールアップ/アウト
しやすいアーキテクチャにした上で、DB側には特に工夫せずに格納する、というのが
パターンとして確立している
548NAME IS NULL:2014/07/18(金) 01:31:23.61 ID:???
>>547
NoSQLでいいじゃんとかxmlシリアライズしとけとかって話なら、早々に言及されてた気がする
549NAME IS NULL:2014/07/18(金) 03:38:55.48 ID:???
>>547
あぁー。そういうこともあって、名前や基礎データにいたるまで、工夫せず>>502のように、、、え?
550NAME IS NULL:2014/07/18(金) 05:19:40.78 ID:50IdpTKo
DBMSは使いませんよ。
SQL的なことはしますが、SQLは使いません。
一応NoSQLです。

オブジェクトの情報を集約し、ある範囲の対象を取りたい場合に
データベース的に扱うとどんな情報があればいいのか
どんな設計にすればいいのかがしりたいわけです。
僕的にも今回の場合、502はわりと素敵な設計だと思います。
551NAME IS NULL:2014/07/18(金) 06:48:23.14 ID:???
いやだから、>>502を全否定してる人はいないだろ
これ以上何の論議がしたいわけ?
552NAME IS NULL:2014/07/18(金) 07:23:52.21 ID:???
なんかやけに >>502 推しの奴がいるな
553NAME IS NULL:2014/07/18(金) 13:24:58.77 ID:???
全否定してるやつもいないが、全肯定してるのは質問者だけだが
質問者がそれで納得してるんだから、さっさとそれで作れば良いのに
554NAME IS NULL:2014/07/18(金) 13:37:39.70 ID:???
質問者も全肯定なんてしてないよね。わりと、でしょ。
自分で考えてるやつあるからそれでどうぞと。
555NAME IS NULL:2014/07/23(水) 22:42:02.92 ID:ueXS7cQr
都道府県テーブル
id|名前
1|北海道
2|青森

チームテーブル
id|名前|都道府県|並び順
1|札幌AAA|1|10
2|東京BBB|8|20
3|浜松CCC|15|30

選手テーブル
id|名前|生年月日|チーム|身長|体重|血液型|足のサイズ|100m走
1|田中|1990/01/10|2|180.0|75.0|A|28.0|11.5
2|佐藤|1989/12/31|1|175.5|80.5|B|26.0|10.8
3|鈴木|1991/01/01|1|177.7|60.0|A|27.5|14.0

身長、体重、足のサイズ、100m走の範囲検索、所属チームの都道府県の検索、並び順は名前、身長、体重、足、100mの昇順&amp;降順
のような、いろんな項目を検索させたり、並び替えさせたりする場合、どのようなindexを貼るのがいいのでしょうか?
556NAME IS NULL:2014/07/23(水) 22:49:02.61 ID:???
Bツリーインデックスかな
557NAME IS NULL:2014/07/23(水) 23:11:15.86 ID:???
そういや、ビットマップインデックスが使いやすい場面って、あるのだろうか

更新が無けりゃいいのかな
558NAME IS NULL:2014/07/23(水) 23:56:17.21 ID:???
ごく限られた場合にのみ、僅かにメリットが得られるのみ

そのトレードオフとして、何かのインデックスを扱うときに、それがBツリーかビットマップかを
判断しなければならない手間とかといったデメリットを考えると、間尺にあわん
559555:2014/07/24(木) 08:11:00.86 ID:RfQppZp+
>>556-558
回答ありがとうございます。
となったら、特に貼る必要もないのですね。 更新コストが馬鹿にならないですが、様々なパターンの複合indexでも貼るのかどうか、気になっておりました。
560NAME IS NULL:2014/07/24(木) 08:50:17.01 ID:???
>>559
検索条件に指定されやすいカラムだけ張っとけ
561NAME IS NULL:2014/07/25(金) 00:09:34.62 ID:???
BIツールが発行する動的SQLみたいなののためのインデックスのことかね

BIツール側の自由度を高めるほど、インデックスは効き目が薄くなっていく
562NAME IS NULL:2014/08/20(水) 10:30:40.54 ID:4cvw8JQq
一覧が落ちてる 保守
563NAME IS NULL:2014/08/23(土) 08:22:56.98 ID:???
au氷水ディレクター戦争タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり塩肉マンつばめの巣担々麺野菜炒めラーメン

au氷水ディレクター戦争タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり肉マンつばめの巣塩担々麺野菜炒めラーメン

au氷水ディレクター戦争タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり肉マンつばめの巣塩担々麺野菜炒めラーメン

ニンニクヤーフォー低額土地NHK名古屋遅延電池切れ福岡損保新規駐車近代ゲームフジワイプ転職提案ラーメン
abk公式漏洩安保険王なにあげてんだよ?「わー!ふーう?」↓↓★★↓↓宿題通調印鑑カウントダウン息子議員国会大学生
564NAME IS NULL:2014/08/25(月) 15:21:29.17 ID:6xD79/Jd
うちの一部門だけ昔からの付き合いで、メインで使ってるとことは異なるベンダーが
Accessで作った業務ソフトを使ってるんだが、そのデータを取り込む必要があって
とりあえずCSVでもいいからよこせつったら、渡されたテーブルの日付フィールドが和暦だった・・・
まあ取り込む時に変換すりゃいいんだろうけど、ちょっとなんだかなーって感じで脱力した。
もしやと思ってMDBのぞいてみたら、日付型はガン無視して文字型で和暦が格納されてる・・・
しかも、西暦に変換するテーブルまであるしw
こんなの初めて見たんだけど、業界的にこういうのもありなの?
565NAME IS NULL:2014/08/25(月) 15:36:25.25 ID:???
>>564
作った時期とか
おまえの所が和暦文化なら
あるんじゃね?
平成になって西暦重視になったところも多いし
566NAME IS NULL:2014/08/25(月) 17:45:25.82 ID:???
そういや西暦和暦変換ってあんまりすることがなくなったな。前はよくやってたのに。
567NAME IS NULL:2014/08/26(火) 03:31:50.46 ID:???
>>564
昭和64年3月31日と
平成元年3月31日を
区別する必要があるなら日付型は使えない。
568NAME IS NULL:2014/08/26(火) 03:35:12.39 ID:???
>>566
元禄とか慶長とか天平勝宝とかの和暦を西暦に直したいんだけど、良い手が見つからない。
趣味のプログラムなんで急いではいないけど。
569564:2014/08/26(火) 08:40:30.50 ID:???
>>565
平成以降の作。ていうか2000年以降だし。
最近もVerUPしてる。

>>567
たぶんその必要はなさそう。
売上げ入れて請求書を出すだけのもんだし。
570NAME IS NULL:2014/08/26(火) 08:45:18.20 ID:???
>>567
> 昭和64年3月31日と

そんな日付は存在しない
年度処理とかで、仮想的に昭和として扱う場合でも、単に表示するだけとかなら文字列でいいけど、なんかの処理するなら普通に日付型にして出力時点で変換した方がいいと思う
571NAME IS NULL:2014/08/26(火) 09:04:38.34 ID:???
>>569
和暦と2000年は無関係
572NAME IS NULL:2014/08/26(火) 09:09:08.14 ID:???
>>569
全部和暦なんだろ?
573NAME IS NULL:2014/08/26(火) 12:27:47.85 ID:???
>>571
いや、そんだけ新しいって事で、2000年問題を絡めたわけじゃないよ。
574NAME IS NULL:2014/08/26(火) 12:49:37.23 ID:???
>>568
西暦でもグレゴリオ暦に切り替える前か後かで違ってくるしねえ、しかも国によって違う
ユリウス日で統一して取り出すときに変換するしか・・・
575NAME IS NULL:2014/08/30(土) 18:39:44.88 ID:???
>>568
その辺の和暦がよく分からんが対応表作ってれば良いんじゃないの?
576NAME IS NULL:2014/08/30(土) 19:25:57.08 ID:???
>>574
カソリックの方が暦の近代化が早くて、
英米のプロテスタントの切り替えが遅かったというのが興味深いです。

>>575
太陰太陽暦だと閏月があったりして、単純に置き換えられないんです。
577NAME IS NULL:2014/08/30(土) 19:51:02.34 ID:???
>>576
でも一回作ればあと楽だし、ググって見つかりそうな気もするが
578NAME IS NULL:2014/08/31(日) 03:27:14.69 ID:???
>>576
カトリックのトップの教皇が作ったものをプロテスタントの国々が簡単に受け入れるわけないでしょ。

明治改暦以前の暦をグレゴリオ暦やユリウス暦と相互変換するのは基本的にテーブルにするしかない。
そんなサイトがあった気がするが…
579NAME IS NULL:2014/08/31(日) 03:28:35.72 ID:???
天文気象板の暦関係のスレに行けば詳しい人がいると思う。
580NAME IS NULL:2014/10/18(土) 11:04:21.84 ID:???
レプリケーションだが意見くれ!
マスタ側のFK付テーブルは読取専用スナップショット(サブスクライバ)側でもFK付けるべきなのか。
sqlserverでの答えを探してるけど、他のDBでの意見もお願いします
581NAME IS NULL:2014/10/23(木) 07:58:26.04 ID:???
正規化してくと、一つの画面の機能で複数のテーブルにインサートしたりセレクトしたりしてSQL文が多く作られるんだけど、SQL文が増えようが、アプリ開発においては正規化したほうが正しいと考えていいですか?
582NAME IS NULL:2014/10/23(木) 14:06:35.44 ID:???
>>581
まさかとは思うが、JOINは知ってるよね?

それはさておき、深刻なパフォーマンス問題が生じない限り、正規化はしといて損はない。
583NAME IS NULL:2014/10/23(木) 16:21:06.94 ID:???
>>581
はい。

>>582
インサートの話もしてるんだから、join知ってるかどうかによらず、増えることは確かでしょ。
584NAME IS NULL:2014/10/23(木) 16:29:01.78 ID:???
普通に正規化した状態で、「一つの画面の機能」で
複数のテーブルの更新ってそれほど多くない気がするけどな。
可変長の項目が多数あるとかくらいじゃね?
585NAME IS NULL:2014/10/23(木) 23:27:17.15 ID:???
都道府県リスト、区市町村リスト、番地リスト
586NAME IS NULL:2014/10/23(木) 23:49:27.24 ID:???
ちょっと何言ってるかわかんない
587NAME IS NULL:2014/10/24(金) 00:00:45.93 ID:???
3つのリストフィールドから構成される住所画面
588NAME IS NULL:2014/10/24(金) 00:04:06.73 ID:???
その住所を格納するテーブルが複数に分かれてるの?
589NAME IS NULL:2014/10/24(金) 02:49:09.07 ID:???
リストがあってマルチで選択
590NAME IS NULL:2014/10/24(金) 03:59:11.37 ID:???
番地リストに市区町村コードが無いなんてありえないだろ?
591NAME IS NULL:2014/10/24(金) 04:57:58.03 ID:???
>>589
おちつこ?
592NAME IS NULL:2014/10/24(金) 09:01:43.84 ID:???
>>581
要件による
過度の複数テーブル化は検索速度が落ちるから、とことん高速化を目指すシステムなら、少し位の冗長性は許容する
まあ、更新データ多いと判断が難しい
593NAME IS NULL:2014/10/24(金) 11:12:19.77 ID:???
>>581
DBアナリストに取りつかれると、正規化は絶対的な正義になるけど、
ぶっちゃけ面倒くさいから、作り易さから考えた方が良いよ。


ただ、データ件数が数百万、数千万件に行くとかなら別だけどね。
594NAME IS NULL:2014/10/24(金) 11:55:15.34 ID:???
>>583
> インサートの話もしてるんだから、join知ってるかどうかによらず、増えることは確かでしょ。
JOIN知ってるか知らないかでクエリの回数が違うでしょ。
データレコードを取得して、関連するマスタを何回もSELECTして、それをループで回すという極悪コードを見たことあるし。
595NAME IS NULL:2014/10/24(金) 18:19:10.71 ID:R3rzZn6a
バカ相手にしても時間の無駄だぞ
596NAME IS NULL:2014/10/24(金) 18:30:42.23 ID:???
581です。
みなさん有難うございます。

私は設計はしたことがないのですが、興味があったので情報処理を受け、正規化は正義と学びました。

>>592>>593
さんがおっしゃるような
判断基準をしりたいなと思っていますが、やはり開発に携わり経験を積むしかなさそうですね。
597NAME IS NULL:2014/10/24(金) 18:31:53.57 ID:???
>>595
>>594のことだよね
598NAME IS NULL:2014/10/24(金) 18:39:13.53 ID:???
あれ。>>593も変なこと言ってるね。

前段では正規形を崩してでも作りやすさを取れと言っていて
後段はデータ件数多いときの話だから、一般的に正規形を崩すきっかけの話だと思うんだが、
「別だけど」と続いている。
599593:2014/10/24(金) 19:31:30.78 ID:???
>>598
自分は、開発規模が大きければ大きいほど正規化の有効性が出ると思っているので。

開発人数が多人数もしくは長期に渡るのであれば、出来れば正規化されている方が良い。
テーブルが小さければ小さいほどテーブルに対するミスが減るからね。

けれども小規模な開発であれば、正規化なんてあんまり考える必要は無い。
正規化よりもプログラミングのしやすさを優先させた方がずっと効率良く開発できる。

オブジェクト指向での設計・プログラムをどこまでするのかと同じようなものかと。
再利用されない事が決まっているようなものをどこまで正しく作りこむか。
(これも規模が大きければ多きほど正しくオブジェクト指向で作成した方が良い)

あと、正しくインデックスが貼ってあるのであれば、正規化によるコストロスはだいたいが無視できるレベルじゃないかな。
そもそも、速度の為に正規化を崩すってのは間違い(インデックスや正規化が間違っている)だと思っているので。

一番の影響は開発工数だよ。
ちょっとデータを見たり変えたりするのに、いろんなテーブルへ操作しなくてはいけないなんて無駄コスト。
たかだがちょっとした一覧を出すのに、マスタの為にJOINが何十にもなったりとか泣けてくる。
600NAME IS NULL:2014/10/24(金) 19:32:54.84 ID:bd39MiQK
そんなのよりKVSの設計どうしてんのよ
全然イメージ湧かんわ
601NAME IS NULL:2014/10/24(金) 19:45:07.11 ID:???
たとえば小規模な例だけど、CDの一覧表示を行うとする。
order by アーティスト名, アルバム発売日 offset 300 limit 20 というクエリの速度を出す場合、
・アーティストテーブル.アーティスト名
・アルバムテーブル.発売日
というインデックスを作ってもだめだと思うんだけど間違い?
602NAME IS NULL:2014/10/24(金) 20:07:27.33 ID:???
>>601
アーティストとアルバムとの対応関係を表すカラムにもインデックスを張らないと
アーティスト毎にロウをシーケンシャルサーチするから、まともな性能にはならんだろね

つまり>>601ではだめだから、間違いで正しい
603NAME IS NULL:2014/10/24(金) 20:09:00.94 ID:???
・アルバムテーブル.アーティストID
 アルバムテーブル.発売日

というインデックスにすれば性能は出ると?
604NAME IS NULL:2014/10/24(金) 20:12:50.43 ID:???
つまり何がいいたいかというと、
limit offset の最適化を行わせることと、
複数テーブルに散らばっているソート項目は水と油だってことで。

JOINが何十にもなる、そのマスタが本当にJOINであるべきかどうかはさておき、
各マスタが表示順のような項目を持っていた場合に、性能でないでしょと。
605NAME IS NULL:2014/10/24(金) 20:23:50.64 ID:???
>>601
テーブル構成もwhere条件も件数も書かんでエスパーしろってか
どうしてもその条件に速度だしたいなら(アーティスト名, アルバム発売日)でインデックス張れや
最近のDBMSならビューに対してでもインデックス張れるから
606NAME IS NULL:2014/10/24(金) 20:24:48.30 ID:???
>>603
アーティスト名で順序指定(order by)しているから、
そのインデックスだとクエリ実行の度にソート処理が必要になる
結果として、性能は>>601よりも更に劣化すると思われ

あと規模や性能とは関係しないが、そのDB設計だと
コンピレーションを無視しているみたいだけど、それでいいの?
607NAME IS NULL:2014/10/24(金) 20:29:12.45 ID:???
ソートのため(だけ)のインデックスなんて有用性高いか?
インメモリソートならそんなに時間かからんし、
メモリに乗らない量のデータをソートする要件があんまり浮かばん
DWHとかなら結構必要なのか?
608NAME IS NULL:2014/10/24(金) 20:32:36.90 ID:???
>>605
単純な例のつもりだから大丈夫かと思った。エスパーありがとう。
ビューにインデックスがはれるDBMSなら確かに。でも、そうじゃない場合はどうします?

>>606
あら。
・アーティストテーブル:アーティストID, アーティスト名
・アルバムテーブル:アーティストID, 発売日
にすればよろしいでしょうか。
また、コンピレーションというのは何でしょうか。無知ですみません。
609NAME IS NULL:2014/10/24(金) 20:36:04.62 ID:???
あれ、ちがうなぁ。
・アーティストテーブル:アーティスト名, アーティストID
・アルバムテーブル:アーティストID, 発売日
にすれば、複数のインデックスを元に、limit offset の最適化が行われるということでしょうか。
610NAME IS NULL:2014/10/24(金) 20:54:16.18 ID:???
>>608
>そうじゃない場合はどうします?
selectの結果の件数が数万件のオーダーなら別にどうもしない
しいて言うならソートワークのメモリ多めに取るようチューニングするぐらい
数千万とか億とかのオーダーなら、そもそもlimit offset するっていう要件を見直す
611NAME IS NULL:2014/10/24(金) 21:06:31.45 ID:???
>>606
あ、、コンピレーションって複数アーティストが参加しているコンピレーションアルバムのことでしょうか。
てっきり設計手法か何かかと。

例なのでそういうのは無視してもらって、
正規形を満たした状態で、ソート条件が複数テーブルにわたる場合、
インデックスのみでは解決できないように思ってるんですが間違いでしょうか。

> (インデックスや正規化が間違っている)
これに、マテリアライズドビューが含まれているということなのかなぁ。。

>>610
たかが数万件でも、メモリ上でソートを行うのとインデックスが使われるのでは
大きな違いがあると思います。
それがたとえば3ms と 0.02ms で、実際どちらも問題ない速度であったとしても、
query per secでは大きな差になりますよね。
612NAME IS NULL:2014/10/24(金) 21:07:23.62 ID:???
思ったんだが
最近のオプティマイザって、基本的に全体の処理量が最少になるように最適化するよな
その際にlimitとかoffsetとか考慮されてないよな

この例なら最終的には320件の結果セットがあれば良いわけだから
アーティスト名(のインデックス)を順次ループして320件で打ち切れば良いんだが
そう言う実行計画は作らんのだろうか
これならアーティスト名にインデックスがあればそこそこ行けるんじゃ

昔のオラクルとか、ファーストロウに対して最適化されてたような気がするんだが
613NAME IS NULL:2014/10/24(金) 21:12:11.88 ID:???
>>612
確かに、アーティストを320件抽出すれば必要最小限のアーティストに対して
アルバムを結合することはできますね。
でも、limit 20 offset (全アーティスト数よりも大きい数字) になった場合、
その最適化は働かなくなります。
614NAME IS NULL:2014/10/24(金) 21:28:09.14 ID:???
正規形を崩して、アルバムテーブルにアーティスト名を持たせると、
・アルバムテーブル:アーティスト名, 発売日
というインデックスを作ることができ、limit offset が解決できるようになります。

ただ、アルバムテーブル.アーティスト名の同期を取る手間が増えるんですが、
それはDBMSによってはマテリアライズドビューの同期の手間と同じようなものだと思います。

ソート項目が複数テーブルにわたる場合、正規形を保ったまま、上記のようなインデックスを
はったときと遜色のない性能を出せたことがなく、件数が増えると正規形を崩すのはやむなしかと思ってました。
615583:2014/10/24(金) 22:03:08.90 ID:???
パッと見サブクエリで高速化きそうな?ダメかな?MySQL?書式分からんけどw

SELECT * FROM (SELECT ID FROM 〜〜 order by アーティスト名, アルバム発売日) offset 300 limit 20
616NAME IS NULL:2014/10/24(金) 22:21:36.92 ID:???
>>614が何を議論したいのかわからん
617NAME IS NULL:2014/10/24(金) 22:37:54.57 ID:???
>>615
正規化状態でですか?それなら、差はないかと。
正規化を崩していれば、そのサブクエリはインデックスが同等の働きをするのでサブクエリ化しなくてもよいと思います。

>>616
正規化を崩すことでパフォーマンスがあがる場面はあると思っていたけれど
インデックスや正規化を間違えてるだけ(>>599)という話になったので、
どういう正規化およびインデックスにすれば性能がでるのか教えてほしいと思ってます。
618NAME IS NULL:2014/10/24(金) 22:57:11.05 ID:???
>>617
特定の状況やクエリを見れば、正規化を崩すことでパフォーマンスが上がる事はある
以上、この話題終了
619NAME IS NULL:2014/10/24(金) 23:12:11.38 ID:???
荒れる質問してしまいすみませんでした。

データベースを独学で学ぶうえで、以下のような玄人が思想を説明している動画やサイトってあったりしますか?

http://youtu.be/VK4GpC34fBw
620NAME IS NULL:2014/10/24(金) 23:38:45.27 ID:???
>>618 = >>599 なら、それで終了でいいと思うけれど。

別に荒れる質問をしたつもりもないんだけどなぁ。。。
621NAME IS NULL:2014/10/24(金) 23:53:26.01 ID:???
>>614
>正規形を崩して、アルバムテーブルにアーティスト名を持たせると、

リレーションの正規化ってものを一度ちゃんと勉強したほうがいい。
622NAME IS NULL:2014/10/24(金) 23:54:45.91 ID:R3rzZn6a
バカ相手にしても時間の無駄だぞ
623NAME IS NULL:2014/10/24(金) 23:58:50.96 ID:???
>>621
おや、、そこに異を唱える人が出てくるとは思ってなかった。
アーティスト名はアーティストテーブルにあるべきだし
アルバム発売日はアルバムテーブルにあるべきじゃないの?
624NAME IS NULL:2014/10/25(土) 00:07:39.66 ID:???
あ。
アーティスト名は主キーになりうるから、
アルバムテーブルにアーティスト名を持つことは必ずしも間違いではないという話かも。

そうなら、アーティストテーブルの活動開始日, アルバム発売日ではどうでしょうか。
625NAME IS NULL:2014/10/25(土) 00:48:10.26 ID:???
>>614,617
まず「正規形を崩す」という言葉をそのまま解釈するのが、ありがちな間違い
今回のケースは非常に単純なデータモデルで検索条件も確定しているから、
最初からその検索条件に特殊化した(= 最適化した or 崩した)テーブル設計ができた

でも現実世界のDB設計は違う
データモデルは複雑だし検索条件も(遠い未来を含めて)確定できない
新規開発時に(正しい論理設計の後で)正規化を崩してテーブルを実装してしまうと、
その時だけは要求性能を満足できても、その後に長く続く保守(= 機能エンハンス)のフェーズで
異なる検索条件を要求された時に対応が極めて困難になる
だから教科書に書いてあるような「正規形の崩し」は、現場だとバッドノウハウになる

ではどうするかというと、正しく論理設計された(=正規化された)データモデルは触らない
代わりに、特定の検索条件に最適化した検索専用テーブル(「ターボテーブル」とも呼ぶ)を追加する
626NAME IS NULL:2014/10/25(土) 00:56:17.86 ID:???
>>625
レスありがとうございます。
まったくもっておっしゃるとおりだと思います。

> 代わりに、特定の検索条件に最適化した検索専用テーブル(「ターボテーブル」とも呼ぶ)を追加する
マテリアライズドビューの使用が可能なDBMSであればそれを使えばよく、
使用できないDBMSであれば、マテリアライズドビューの代わりとなるような
実テーブルを用意するということであっていますか?
627NAME IS NULL:2014/10/25(土) 01:16:38.45 ID:???
>>626
マテリアライズドビューについては理解している自信が無いのでコメントできない

その検索専用テーブルとは、正しく論理設計された(=正規化された)データモデルから
部分的に複写した一時テーブルであり、正規化の原則に従う必要は無い(>>614もO.K)
複写処理はデータモデルの更新処理と完全に同期させる完全な方法もあるけど、
一定期間毎の複写でもかまわないケースは多い(一時的に実データと検索結果にズレが生ずる)
628NAME IS NULL:2014/10/25(土) 02:31:23.66 ID:???
>>626
今のマテビューがどうなってるか知らんが、オラクル以外でこの用語つかってるDBMSあるかな?
マテビューってのはもともとオラクルでレプリケーションのための実データ(のコピー)を持つビューだったはず
検索のためのインデックス付きビューは実データ部分は持つ必要ない
あくまでインデックス項目のデータだけ持てばいい
そういう意味ではインデックス付きビューとマテビューを同一視するのはどうかと思うのだが

あと>>625の言うターボテーブル(この言い方は初めて聞いたが)も
更新のコストの問題があるから、ターボテールブル作成(更新)のタイミング等をコントロールしたりする
これもマテビューとは別ものと考えないとダメじゃないかな

あとそもそも、インデックスは制約じゃないので、本来はDB設計じゃなくてチューニングの話ね
(当然DB設計時にある程度は見越しておくけど)
性能要件もDB設計だって言うなら話は別だが
629NAME IS NULL:2014/10/25(土) 05:36:58.95 ID:???
一応、今回はシンプルだから崩した形にできたという事実も確かにありますが、
もともとは、正規化されたテーブルとそれぞれのインデックスだけでは、
本来出てしかるべき性能が出ないことがあるというのを説明するための最小構成の例を出すためでした。
お付き合いありがとうございました。

>>627
検索専用テーブルを用意すれば更新コスト、ディスク領域使用量は増えてしまいますが、
汎用的に解決できる方法だと思いました。
それを思いついたことはあっても、不恰好な気がして手を出せずにいましたが、
実際応答速度が上がると思うので使ってみます。

>>628
細かな機能的には差異があるかもしれませんが、PostgreSQLにもマテリアライズドビューがあります。
インデックス付きビューが実装されているDBMSはとても楽に今回の問題が解決できるので、
使える場合は積極的に使うようにします。
630NAME IS NULL:2014/10/25(土) 08:43:46.25 ID:???
>>624
PKは商品コード
アーティスト名は別アルバムで被るからPKにならない
631NAME IS NULL:2014/10/25(土) 09:01:16.28 ID:???
>>601
本来はこうなるはず
PKが商品コード
select アーティスト名、発売日
where 発売日 between a and b
order by 商品コード、発売日

なので、インデックスいらんな
632NAME IS NULL:2014/10/25(土) 10:28:50.77 ID:???
アーティストテーブルは確かに欲しいけども、同じアーティストが
アルバムごとにアーティスト名を変えたりするケースもあるから
アルバムテーブルにもアーティスト名のカラムは入れた方が良いと思う
633NAME IS NULL:2014/10/25(土) 12:55:24.16 ID:???
>>631訂正
商品(アルバム)のPKは商品コード
アーティストのPKはアーティストID

select b.アーティスト名、a.発売日
from 商品 a inner join アーティスト b
where a.アーティストID = b.アーティストID
a.発売日 between a and b
order by b.アーティスト名、a.発売日

駆動表が商品だから、order byでインデックス効かない
634NAME IS NULL:2014/10/25(土) 14:31:04.25 ID:???
こういう設計だと、買ってきたCDからデータと入れようとしたときに同名のアーティストのどっちなのか
いちいち調べたり、アーティスト名の表記の違いを名寄せする手間が必要になったりする。
正しくアーティストを特定するというのが要件のうちであればそれでいいんだけどね。
635NAME IS NULL:2014/10/25(土) 21:04:38.81 ID:???
買ってきたなら分かるだろ(笑)
636NAME IS NULL:2014/10/25(土) 21:32:09.35 ID:???
マニアなら
trfがTRFに変わったように年代ごとに細かく分けたい気持ちはわかる
637NAME IS NULL:2014/10/25(土) 21:49:08.16 ID:???
話変わっててわろた
638NAME IS NULL:2014/10/25(土) 22:20:59.07 ID:???
まぁ確かに、自分で選んで買ってきたならアーティストは特定できるな。
要は、>>633の設計を成り立たせるには、IDを決定するのにそこに存在しない
情報が必要になるかもしれないという話。
639NAME IS NULL:2014/10/26(日) 02:44:25.73 ID:???
話広げたらなw
640NAME IS NULL:2014/10/26(日) 02:47:04.27 ID:???
CD管理の設計の話に進めるんだったら、
それこそ上でも出ていたようなV.A.であるようなCDを
どう管理するのかのほうを急いだほうがいいんでない?
641NAME IS NULL:2014/10/26(日) 03:43:08.83 ID:???
CD管理ってかアーティスト管理?
興味はあるけど、まず要件がまとまらんだろ
642NAME IS NULL:2014/10/26(日) 08:04:21.98 ID:???
ここ見てていつも思うのが、要件定義をろくにしないで設計始めちゃう奴の多いこと。
ひどいのになるとフィールド名見ただけで「それは正規化されてない」とか言っちゃうしなぁ。
643NAME IS NULL:2014/10/26(日) 09:20:20.48 ID:???
こんな雑談スレに何を期待してるんだ。
644NAME IS NULL:2014/10/26(日) 09:35:39.26 ID:???
みなさんテーブル設計のツールはなに使ってますか?
645NAME IS NULL:2014/10/26(日) 09:52:06.49 ID:???
>>644
ポストイットとホワイトボード
646NAME IS NULL:2014/10/26(日) 09:59:21.71 ID:???
普段は、紙と鉛筆とコーヒーを使っています
647NAME IS NULL:2014/10/26(日) 10:11:34.91 ID:???
>>645
出来上がった物は、スマホで撮影するよな
648NAME IS NULL:2014/10/26(日) 18:47:31.66 ID:???
ER図やテーブル定義書やテーブル作成のSQLはなんのツールで作ってますか?
649NAME IS NULL:2014/10/26(日) 20:04:36.68 ID:???
SQL Developer
SQL Developer Data Modeler
紙、ボールペン、ホワイトボード
650NAME IS NULL:2014/10/26(日) 20:33:09.53 ID:???
ER図…ホワイトボード、ポストイット
テーブル定義書…Excel
テーブル作成のSQL…Excelのマクロ
651NAME IS NULL:2014/10/26(日) 22:41:58.36 ID:???
ありがとうごさいます。

何で設計を学びましたか?
652NAME IS NULL:2014/10/26(日) 23:26:28.22 ID:???
・データベーススペシャリスト試験
・先輩・上司から学ぶ
・データベース設計に関する参考書
・SQLアンチパターンの参考書
・Oracle Database設計の講習
653NAME IS NULL:2014/10/26(日) 23:46:29.61 ID:???
資格はとったのですが、教わる人がいなくて、とりあえず楽々ERDレッスン中です。終わり次第SQLアンチパターン買ってみます。

Oracle=高いというなんとなくイメージがあり敬遠してましたが、講習は無料もあるみたいですねー
654NAME IS NULL:2014/10/26(日) 23:54:32.92 ID:???
655NAME IS NULL:2014/10/27(月) 14:50:00.90 ID:???
ER図とテーブル定義書とDBマイグレーション(flywayとかliquibaseとか)を
うまいこと連携させる回し方みたいなのありませんかね
656NAME IS NULL:2014/10/29(水) 12:50:37.43 ID:???
初めての設計でパニクってます。ワークフロー系のシステムなのですが、参考になる書籍などあれば教えて下さい。。。


いま取り組んでるものは、質問内容に対して回答し、クローズするワークフローシステムです。

大きなフローとしては
「質問部署→回答部署→クローズ部署」
で、その各部署内で「作成→審査→承認」のフローがあります。

お客様からは以下の要望は必ずみたして欲しいと言われています。

要望1.前部署への差し戻し機能、部署内での差し戻しがあります。

要望2.ワークフローを変更した場合の既存プログラム改修を最小限になるデータベースにして欲しい。

要望3.回答部署は複数部署可能とする。その際は各回答部署内で並列に作成審査承認をし、全回答部署が承認された場合に、クローズ部署にいく。
657NAME IS NULL:2014/10/29(水) 12:52:58.07 ID:???
DBの設計で悩む話じゃないと思うが。
今考えてるテーブル書いてみ?
658NAME IS NULL:2014/10/29(水) 13:01:57.23 ID:???
DBと関係ない気がするが・・・
659NAME IS NULL:2014/10/29(水) 14:31:06.36 ID:???
それ作るか?って機能だなw
ちゃんと作るなら稟議のミニセットだしそれだけ作るなら機能として片手落ち
660NAME IS NULL:2014/10/29(水) 21:31:50.41 ID:???
ステータスの状態遷移をどうするかとか、あったっけなぁ

出来合いのワークフローのソフトとか使ってみて仕様確認しながら
要件定義ちゃんとした方がいいような気もするなぁ
で、出来合いのやつでいいかもしれないし

最低限で作るとしても、
こんな場合はどうするんだとか、後からいろいろ出てきたり
ちょっと汎用的に作ろうとするとそれなりに
大がかりになりそうだし

まず、権限設定と、ログインして使用してもらう必要があったりとかもあるな
661NAME IS NULL:2014/10/29(水) 21:34:59.02 ID:???
思いついたのはこんな感じですが、
先輩にはデータベース設計を勉強してこいと言われました


質問(質問ID(PK)、内容、作成者、作成日、審査者、審査日、承認者、承認日)

回答(回答ID(PK)、内容、作成者、作成日、審査者、審査日、承認者、承認日)

クローズ(クローズID(PK)、内容、作成者、作成日、審査者、審査日、承認者、承認日)

質問回答連関(質問ID(PKFK)、回答ID(PKFK))
回答クローズ連関(回答ID(PKFK)、クローズID(PKFK))

ユーザ(ユーザID(PK)、名前、部署ID(Fk)、作成権限フラグ、審査権限フラグ、承認権限フラグ、削除フラグ)

部署(部署ID(PK)、部署名、削除フラグ)
662NAME IS NULL:2014/10/29(水) 22:29:10.51 ID:???
そもそもの要件整理不足が否めないが
俺ならheader-detailで遷移はheader.statusで対応
663NAME IS NULL:2014/10/29(水) 23:48:38.92 ID:???
>>656,661
要求事項だけで機能仕様が不明確な段階では、
いきなり論理設計(=デーブル設計)に着手するよりも
概念設計から始めたほうがいいと思う
概念設計を簡単に説明すると:
・要求書に含まれた単語で表される概念を列挙して箱として描き、
・関連する(と思われる)概念の箱の間に線を引き
・概念の役割を以下から割り当て、箱に記入するか楕円や菱形へ書き換える
  実体(エンティティ)/識別情報(キー)/属性(アトリビュート)/リレーション(関連)
最初はホワイトボードや裏紙にラフスケッチすることから始めよう

今回のケースだと、概念設計のポイントは以下の2点
・ワークフローシステムは、部署をノード(節)、ワークフローを矢印(アーク)とする
 有限グラフとして表現できる
・「作成→審査→承認のフロー」は、質問および回答が持つ「状態の遷移」として表現できる

具体的なE-R図(データモデル)と状態遷移図(状態モデル)を以下にアップしておいた
 http://www.h6.dion.ne.jp/~machan/misc/workflow-data.png
 http://www.h6.dion.ne.jp/~machan/misc/workflow-state.png
これを「叩き台」にして、シナリオとの整合性を検査したり、論理ER図、状態遷移表、
そして手続き(=遷移)等の詳細化を試みるのがいいのではないかと思う

>>657,658,659
システム開発において、DB設計(データモデルの設計)から着手するという
>>656の検討方針(先輩の指導方針?)は妥当だと思うよ
まあ、要求分析や製品企画といった上流工程の実務経験が無い人には難しいかもしれないね
664NAME IS NULL:2014/10/29(水) 23:58:54.80 ID:???
>>663 にミスがあったので訂正

X:・ワークフローシステムは、部署をノード(節)、ワークフローを矢印(アーク)とする
   有限グラフとして表現できる

O:・ワークフローシステムは、部署をノード(節)、ワークフローをアーク(矢印)とする
   有向グラフとして表現できる
665NAME IS NULL:2014/10/30(木) 00:05:07.54 ID:???
ああ、この人まだいたのか。久しいな。
666NAME IS NULL:2014/10/30(木) 00:11:11.38 ID:???
>>661
いいんじゃねーの。
作成者、審査者、承認者はユーザIDなんでしょ?

先輩の言いたいことはあらかた予想できるけれど、
それをどう結合して、どう操作すれば運用をしていけるか先輩に説明してみたらどうだい。
667NAME IS NULL:2014/10/30(木) 00:12:08.11 ID:???
車輪の再開発はシステム開発とは違うしな
上流経験が本当にあるなら要件整理した段階で開発は止めるレベルの物だよ
668NAME IS NULL:2014/10/30(木) 01:28:17.03 ID:???
開発止めてどうするの?
出来合いのもの金出して買うの?

軽いものでいいから
新人の教育がてらに費用かけずにやろうって計画に見えるな
669NAME IS NULL:2014/10/30(木) 03:17:20.16 ID:???
エンティティおじさんか?
670NAME IS NULL:2014/10/30(木) 07:49:25.93 ID:???
>>663
ありがとうございます。

作成、審査、承認というイベントを分割出来るか考えてみます。

また、履歴について考慮していなかったので、全ての処理履歴を取れるように改善します。
671NAME IS NULL:2014/10/30(木) 07:58:37.72 ID:???
>>658
この手のアプリケーションなら普通に DB 使うだろ。

>>668
お客様って言ってるのがちょっと引っ掛かるが、その先輩が勉強がてらちょっとやらせてみてるって感じなんだろうな
>>661 で、ユーザー/部署テーブルに削除フラグつけてたりするから全くド素人って言うわけでもなさそうだし
672NAME IS NULL:2014/10/30(木) 11:21:36.22 ID:???
現状はどんな仕組みで承認してたりするのか
紙ベースなのか、既存の仕組みがあるのか
どんな紙の書式なのか
どういった点を、改善したいと思ってるのか
実験的なシステムなのか
おそらく関係部署が多いと、調整も必要
誰が誰に承認依頼を出すのかとか、代理承認とかも許すのかとか
673NAME IS NULL:2014/10/30(木) 12:54:04.15 ID:???
>>671
受注が確定してないので教育がてらに私が任命されました。今はお客様のふりをした先輩とやりとりしています。本業務は別なので、進みは非常に悪いです。

>>672
背景は現状メールでやりとりされていて、しっかりと管理されていない情報がある。ISO監査で指摘されたのでシステム化するものです。(詳細不明)

上記の理由により仮定となりますが、>>656に以下を考慮し、もう一度考え直します。

1.部署はたくさんあり。各部には質問、回答、クローズの実施権限を付与する。

2.ユーザーは部署、課に所属する。課を兼任する場合があり。

3.同じ課の同一権限をもつユーザーの代理承認は可能。履歴は代理承認した人とする。

4.各ステップで次ステップのユーザーを指定する。そのユーザにメールがいく。

5.全ての処理は履歴をとる。
検索画面では全て追えるようにする。

6.各処理で添付ファイルをつける。
添付ファイルをつける際にはいくつかの属性を付加する。
ファイルはファイルサーバに格納。

7.ASP.NET+Oracle
674NAME IS NULL:2014/10/31(金) 14:31:13.09 ID:???
>>673
出来合いを検討したけどそれでも開発するって場合は
使い勝手は出来合い並みを求められそうで大変かな
675NAME IS NULL:2014/11/01(土) 21:33:03.97 ID:???
>>674
そうですねー。比べられると辛いです。

ちょっと放置してましたが
「作成→審査→承認」が、
「作成→審査1→審査2→承認1→承認2」など動的に増やせるようにするとこ考えなきゃ。。。
676NAME IS NULL:2014/11/02(日) 00:41:03.67 ID:???
ルートID, 承認順序, 部署ID, イベント名
--------------------------------------
    1,     1,    2, 作成
    1,     2,    3, 審査1
    1,     3,    5, 審査2
    1,     4,    7, 承認

こんな感じで必要なイベントを管理するテーブルでも作っときゃいいんでない?
677NAME IS NULL:2014/11/02(日) 12:58:21.61 ID:???
その会社に開発導入実績があって追加開発依頼だったら
少しはやりやすいが

フェーズ1で導入に理解のある部署に絞ってパイロット導入して
不足機能を洗い出す
フェーズ2で部署を増やして機能追加パターン網羅に努める
フェーズ3で全面導入とかか

新しい機能を使ってもらうのに
問題を感じていない積極的でない部署を説得させるには
ある程度実績がないと、なにかと難しかったりする
部署間調整に結構時間は割かれる
思いつき仕様をどれだけ抑えつつ便利に使ってもらうか
多分仕様は言い出すと切りがない
メール1回じゃ忘れるので承認要請リマインダーを煩わしくない感じで定期的に出してくれとかね
678NAME IS NULL:2014/11/02(日) 13:56:02.19 ID:???
>>677
> 多分仕様は言い出すと切りがない

稟議システム外販してたけど、マジできりがないよ
稟議のフローに関するところはまだしも、社員情報システムとの連携(承認した奴が辞めちゃった時に差し戻されたらどうするとか
、次の承認者を設定する画面で候補者の並び順が気に入らないとか)が地味に面倒
679NAME IS NULL:2014/11/02(日) 18:56:13.75 ID:???
DB設計だけやればいいなら、多少ややこしい要件が捩じ込まれようと
DB上は格納できるように設計し、あとは全部アプリ側で頑張ってもらえば
良い気がするがどうだろう

どんな要件が出そうかは充分に洗い出す必要があるけど
680NAME IS NULL:2014/11/02(日) 19:23:35.85 ID:???
外販されてるいわゆる「アプリケーション」と呼ばれるものはそんな感じだね。
ユーザー要件に応じて様々にカスタマイズできるよう、テーブルはほとんど
ただの入れ物扱いでエクセル表みたいになってる。
DB設計としては吐き気がするような代物だけど。
681NAME IS NULL:2014/11/02(日) 19:45:36.78 ID:???
>>680
> テーブルはほとんどただの入れ物扱いでエクセル表みたいになってる。

単にお前んところの設計が糞なだけじゃん w
682NAME IS NULL:2014/11/02(日) 20:29:32.36 ID:???
ガチガチの定型業務だけをワークフローで小さく始めてって
思ったりするけど
結局その定型業務用に特化したシステムにしたほうが
いいような気がしたりする

項目をユーザーが登録できるような
汎用的なつくりにしていくと多分>>680のようになる
683NAME IS NULL:2014/11/02(日) 20:40:55.55 ID:???
RDBならEXCEL表とほぼ同じだろう
684NAME IS NULL:2014/11/02(日) 21:04:39.13 ID:???
>>683
DBスレでつり?
685NAME IS NULL:2014/11/02(日) 21:18:23.36 ID:MzPGu/L1
EXCEL表って言われてどんなものを想像してるんだろうな
別にDBのテーブルレイアウトそのままEXCELに持っていくこともできるわけだが
686NAME IS NULL:2014/11/02(日) 21:27:11.80 ID:???
>>680>>681
それが本来の正しい姿
テクニカルが凄い!とかただのマスターベーションだよ
687NAME IS NULL:2014/11/02(日) 21:42:49.74 ID:???
>>686
つり?意味不明
688NAME IS NULL:2014/11/02(日) 21:44:12.44 ID:???
>>682-683
このスレ見ない方がいいかと...
689NAME IS NULL:2014/11/02(日) 21:59:50.00 ID:???
>>688
ここRDB専門スレだっけ?
690NAME IS NULL:2014/11/02(日) 22:12:08.30 ID:???
>>689
RDB 専用じゃないけど
> RDBならEXCEL表とほぼ同じだろう
程度の理解力だとねぇ...
691NAME IS NULL:2014/11/02(日) 22:14:47.26 ID:???
みんな短文過ぎて意味ぜんぜんわかんなーい
692NAME IS NULL:2014/11/02(日) 22:17:07.51 ID:???
>>690
あんた、真のEXCEL使いを見たこと無いだろ!
693NAME IS NULL:2014/11/02(日) 22:22:27.74 ID:???
テーブル=EXCEL表+インデックス=EXCELデータベース
694NAME IS NULL:2014/11/02(日) 22:41:01.42 ID:???
Excelは方眼紙切って設計書を書く物だとしか思ってないだろ
印刷ズレまくるのに
普通に集計、分析とかで表として使ってみ
695NAME IS NULL:2014/11/02(日) 22:48:51.49 ID:???
>>680
どんなExcelになっててどんな表が良かったのか
興味出てきた
696NAME IS NULL:2014/11/03(月) 00:43:12.29 ID:???
ほぼ同じとまではいわんが、エクセルのあるべき姿を知らない人が紛れ込むと厄介だね。
697NAME IS NULL:2014/11/03(月) 03:52:20.53 ID:???
[ユーザが項目を追加したり、ワークフローを変更したりとできる汎用的なアプリケーションのDBはExcelの1シートに全ての情報を纏めたような、つまり正規化されていないDBである]てこと?

正規化の限界か
698NAME IS NULL:2014/11/03(月) 04:51:14.63 ID:???
予備1とか作っちゃうんだろう。前時代的にもほどがあるなぁ。
699NAME IS NULL:2014/11/03(月) 09:25:54.64 ID:???
>>696
> エクセルのあるべき姿

Excel スレに行けよ...
700NAME IS NULL:2014/11/03(月) 09:54:27.76 ID:???
予備1とかにせずに
マスターのマスターをつくる感じで
ユーザー管理者が項目を追加できるような仕組みを作ることは
できることだと思うが
実際にユーザーがデータを入力したあとは
項目変更に制限を加えたり
システム連動項目の仕組みを入れたり
マスターのバージョン管理をするようにしたほうが
よかったりというのはあると思う

もっと汎用的にしようと思えばユーザー管理者が
create tableする仕組みも考えられると思うが
ワークフローシステムの場合にそこまでするのかはわからん
701NAME IS NULL:2014/11/03(月) 10:11:23.36 ID:???
Excelに予備1は無いだろ
列追加で終わりだし
正規化も出来るだろう
702NAME IS NULL:2014/11/03(月) 10:57:28.91 ID:???
>>697
1シート1テーブルだろ
否定有りきで無茶論(笑)
703NAME IS NULL:2014/11/03(月) 11:08:57.34 ID:???
>>699
頭悪いなあんた。
704NAME IS NULL:2014/11/03(月) 11:47:11.80 ID:???
>>703
誹謗中傷スレに行けよ
そんなスレがあるかどうかは知らんけど w
705NAME IS NULL:2014/11/03(月) 11:49:03.35 ID:???
Excelついでで全然違うが
Xcuteってツールが面白そうではある
かなり前と思うが日経なんとかに出てたかな
実際に使ったことはないが

今見たらXlsFlowってのもあるみたいだし
706NAME IS NULL:2014/11/03(月) 11:49:27.98 ID:???
>>704
言わんとすることを理解もできずExcelスレに行けというのがまともなレスだと思えるのか
表計算ソフトを使えないことの自己紹介なのかね。
707NAME IS NULL:2014/11/03(月) 11:53:54.72 ID:???
スレ違いだって事、いい加減理解しろ
708NAME IS NULL:2014/11/03(月) 11:58:11.00 ID:???
ODBCのデータソースとしてエクセルブック使えるのに?とまで話を進める必要はないか。
709NAME IS NULL:2014/11/03(月) 12:10:01.68 ID:???
そういう話なら関連はあるんだろうが、
DB設計と結びつけて語らないとな
710NAME IS NULL:2014/11/03(月) 12:14:12.73 ID:???
> テーブルはほとんど
> ただの入れ物扱いでエクセル表みたいになってる。
> DB設計としては吐き気がするような代物だけど。

んだから、こうやって引き合いに出される「エクセル表」が、どの程度のエクセル表なのかって話になるわけじゃん。
吐き気がするような表を使ってる時点で、エクセルをまともに使うことすらできずに卑下するなんておかしくねってことで。
711NAME IS NULL:2014/11/03(月) 12:21:04.58 ID:???
では
>>680
>ただの入れ物扱いでエクセル表みたいになってる。
これの解説を誰かよろしく
712NAME IS NULL:2014/11/03(月) 12:24:57.77 ID:???
>>706
はいはい、真の Excel 使いなのはわかったから、いい加減どっか行けよ
713NAME IS NULL:2014/11/03(月) 12:29:41.15 ID:???

設計論でテーブルとエクセルの違いって?
714NAME IS NULL:2014/11/03(月) 13:05:11.22 ID:???
マスターのマスターを作るやつってSQLアンチパターンにのってたよね
715NAME IS NULL:2014/11/03(月) 14:08:45.36 ID:???
>>711
数字だろうがなんだろうが、全カラム CHAR(255)。
もちろん外部制約やユニーク指定もない。
そしてインデックスすら張ってない。
そんな糞ミドルをよく見かける。
716NAME IS NULL:2014/11/03(月) 14:20:09.97 ID:???
>>715
ユニークとインデックス以外はエクセルでも出来るし
やっぱエクセル表みたいってのはエクセルにも失礼な状態だな
717NAME IS NULL:2014/11/03(月) 14:49:30.25 ID:???
そんなアプリ使うより
京大式カード使うほうが安上がりな気がする
718NAME IS NULL:2014/11/03(月) 19:55:16.35 ID:???
>>715
それをエクセル表みたいと表現したのがまずいだけだと思うわ
エクセルにも劣るとか、エクセル初心者が作った表とかさ、いろいろあるじゃん
719NAME IS NULL:2014/11/04(火) 06:46:58.09 ID:???
DB使える俺スゲーだろ
excel優秀なのに
720NAME IS NULL:2014/11/04(火) 07:49:22.29 ID:???
外部制約やユニークはない方が好きだな
メンテしにくくなるし
721NAME IS NULL:2014/11/04(火) 08:16:11.67 ID:???
>>720
小規模ならそうなんだけど、大規模システムで制約がないとか怖すぎる
722NAME IS NULL:2014/11/04(火) 14:05:21.25 ID:???
>>720
手でメンテするからじゃないかな
723NAME IS NULL:2014/11/05(水) 19:41:04.40 ID:???
>>714
問診アンケートみたいなやつだと項目がやたら多くて
マスターというかアンケートの雛形を作って
さらにアンケートの種類によって項目が違う
回答欄がテキストか数値かとかの項目の種類もあるし
サブタイプとしてテーブル分けたりしたほうがいいのかもね
それでも記録だけならいいんだけど、回答の値を他で
有効に使うにはさらに仕組みが要る

まあ項目を汎用的な仕組みにするのは
使う場面は限定したいし、やらずに済めばそれがいい
あんまりRDB向きではないということだろう

SQLアンチパターンはいい本だな
724NAME IS NULL:2014/11/05(水) 20:13:17.38 ID:???
>>722
一発物は手作業でしょ
725NAME IS NULL:2014/11/05(水) 20:55:57.21 ID:???
>>724
一発物だからという綻びが被害を拡大する
726NAME IS NULL:2014/11/05(水) 21:04:27.39 ID:???
>>725
何の被害だよ?
私失敗しないので
727NAME IS NULL:2014/11/05(水) 22:39:19.72 ID:???
一発物を何発やるの?
728NAME IS NULL:2014/11/05(水) 22:43:05.33 ID:???
>>726
お前自体が失敗だろ
729NAME IS NULL:2014/11/06(木) 00:42:18.75 ID:???
何発しても毎回違えば一発物
730NAME IS NULL:2014/11/07(金) 00:12:57.39 ID:???
外部キーは履歴のこらないから、付けるなって講習で言われた
731NAME IS NULL:2014/11/07(金) 08:01:51.77 ID:???
>>730 外部キーがなければ残る履歴って何よ?
732NAME IS NULL:2014/11/07(金) 12:07:45.59 ID:???
・販売履歴テーブルの売値
・商品テーブルの売値

みたいな話なんでないの?
733NAME IS NULL:2014/11/07(金) 12:45:02.55 ID:???
>>730
どこの講習だよ w
マジでそんなこと言ってるなら、晒していいレベルだわ
734NAME IS NULL:2014/11/07(金) 12:52:48.36 ID:???
履歴が残る残らないの意味から分からんのだが…。
735NAME IS NULL:2014/11/07(金) 13:50:33.98 ID:???
>>732のやつ
他にもいろいろケースはあると思う。そのイベントが発生した時点の値がわからなくなるからイベントテーブルに外部キーは設定しないほうが安全だと言っていた。
講習代で一日三万もはらったよ
736NAME IS NULL:2014/11/07(金) 14:02:53.74 ID:???
どう見ても、こいつがセミナーの内容を理解できないで、断片的な言葉だけ覚えたとしか思えん w
737NAME IS NULL:2014/11/07(金) 15:31:11.29 ID:???
>>729
内容が違えば何度でも手動でメンテしますよと。なんせ一発ものですからね。
やっぱ被害は拡大する一方。
738NAME IS NULL:2014/11/07(金) 20:09:38.63 ID:???
>>737
内容が毎回変わっても自動化できる方法を示さないとね
739NAME IS NULL:2014/11/07(金) 20:12:16.46 ID:???
>>738
その考え方をする状況に至ってるのがもうだめ。
740NAME IS NULL:2014/11/07(金) 20:25:18.85 ID:???
意味解らん
手作業……被害拡大
自動化……考えが駄目
741NAME IS NULL:2014/11/07(金) 20:27:32.10 ID:???
意味がわからんか。馬鹿の壁とはうまく言ったもんだよね。
742NAME IS NULL:2014/11/07(金) 20:54:22.72 ID:???
なるほど、あっち側の人か w
743NAME IS NULL:2014/11/08(土) 00:06:17.00 ID:???
どうせ説明も出来んのだろう
744NAME IS NULL:2014/11/08(土) 00:07:33.77 ID:???
>>739
> その考え方をする状況に至ってるのがもうだめ。
状況に至ってる、なるほどわかる
745NAME IS NULL:2014/11/08(土) 03:33:23.00 ID:???
そもそも自動化された(できる)作業は今ここで議題になってるメンテに含まれんだろ
746NAME IS NULL:2014/11/11(火) 12:27:19.65 ID:???
正規化すると履歴が残らないとかそういうレベルか
747NAME IS NULL:2014/11/11(火) 23:21:37.69 ID:???
>>746
何それ?どうやったらそうなんの?逆に知りたいわ
748NAME IS NULL:2014/11/11(火) 23:50:22.49 ID:???
履歴が残るように正規化すればいいだけではあるけど、参照用テーブルを作ることはよくあるね
749NAME IS NULL:2014/11/15(土) 21:58:25.51 ID:???
履歴を残す残さないと
外部キーは無関係。
750NAME IS NULL:2014/11/19(水) 10:34:29.41 ID:???
アニメと声優の関係って多対多(アニメは複数キャストを登用し、声優は複数のアニメに出る)だと思うんだけど
これを関係データベースとして使えるようにするにはどうすればいいですか?
751NAME IS NULL:2014/11/19(水) 10:47:32.77 ID:???
アニメマスタ(anime_id,anime_name)
声優マスタ(voice_id,voice_name)
出演データ(anime_id,voice_id)
752NAME IS NULL:2014/11/19(水) 10:48:12.52 ID:???
キャラクターそのものは1つじゃないの?
まあ代替わりとかメディアによっては変わるけど同じ作品内ならほぼ固定でしょ
753NAME IS NULL:2014/11/19(水) 11:32:03.92 ID:???
>>752
同じ作品内という括りでは考えていません
今までの全てのアニメとそれに出演した声優でデータベースを作りたいと考えています
754NAME IS NULL:2014/11/19(水) 11:39:45.60 ID:???
>>751
連関ってやつですか
ありがとうございます!
755NAME IS NULL:2014/11/19(水) 19:40:58.07 ID:???
出演してるアニメがわかればいいのか?
キャラクターの情報は要らない?
756NAME IS NULL:2014/11/19(水) 20:30:13.45 ID:???
>>755
おせっかい
757NAME IS NULL:2014/11/21(金) 23:08:46.40 ID:???
DBの勉強したいです大量のサンプルデータってどこかにないですか?
758NAME IS NULL:2014/11/21(金) 23:45:27.87 ID:???
>>757
ベンチ用のデータ
759NAME IS NULL:2014/11/22(土) 01:00:30.78 ID:???
大量って人によって受け止め方違う気がする
普通はどのくらいから大量って呼ぶんだろうか?
760NAME IS NULL:2014/11/22(土) 03:45:59.58 ID:???
>>757
なんか多そうなのいくつか

郵便番号csv (日本郵便)
ttp://www.post.japanpost.jp/zipcode/download.html

気象データ(気象庁)
ttp://www.data.jma.go.jp/gmd/risk/obsdl/

基盤地図情報(国土地理院)
ttp://fgd.gsi.go.jp/download/
761NAME IS NULL:2014/11/22(土) 03:49:14.53 ID:???
>>757
livedoorのグルメdatasetも割と多いんだっけかな?
ttp://blog.livedoor.jp/techblog/archives/65836960.html
762NAME IS NULL:2014/11/22(土) 05:53:15.05 ID:???
>>758,760-761
ありがとうございます!
763NAME IS NULL:2014/11/22(土) 13:16:56.44 ID:???
>>760
国の集めてるデータ自体は只なのを知らん人多よな(笑)
764NAME IS NULL:2014/11/22(土) 13:32:55.26 ID:???
住基データください
765NAME IS NULL:2014/11/22(土) 13:53:43.48 ID:???
公開データじゃないからそりゃ無理
766NAME IS NULL:2014/11/22(土) 20:18:46.29 ID:???
>>763
突然どうしたの?
767NAME IS NULL:2014/11/26(水) 14:08:21.22 ID:???
データベースを作成する際、予めExcelにまとめたりしますか。
データベースに入力するがまとめる作業なのだから二度手間ですか。
768NAME IS NULL:2014/11/26(水) 14:31:41.38 ID:???
データ入力する人によって合わせる
769NAME IS NULL:2014/11/26(水) 14:59:25.15 ID:???
MYSQL初心者の自分が、数万件の資料から、必要な部分のデータだけ引用し、一覧表にまとめて、
条件検索できる形にします。
資料からデータを引用入力する過程を、データベースに直接打ち込むか、
EXCELで一覧を作ってからデータベースを作るかということなのですが。
Excelで予めまとめたものは、MYSQLに再び手入力しなくても、コピーか自動転送できるものですか。
770NAME IS NULL:2014/11/26(水) 15:07:04.63 ID:VxueBJXe
>>769
vbaで一気に入れてる

他のDBではインポートの機能があるけど
771770:2014/11/26(水) 15:08:57.08 ID:???
あ、勿論mysqlでもcsvからならvbaでなくても出来るよ。ここではスレチになるから詳細はmysqlのスレで聞いてくれ
772NAME IS NULL:2014/11/26(水) 15:23:40.97 ID:???
>>770、771 早速お返事ありがとう!
web上で検索できるDBにしたかったので、mysqlについて尋ねました。
これが完成したらきっと世のため人のためになると思うのだけど
初心者なので遠い道のりになりそうです。どこかに協力者がいないものか。
知恵を貸して頂いてありがとうございます。
773NAME IS NULL:2014/11/27(木) 02:33:23.80 ID:???
素直にAccessにしろ
774NAME IS NULL:2014/11/27(木) 13:02:24.07 ID:/d36AIiz
accessはローカルで使うものなのではないのですか?
775NAME IS NULL:2014/11/27(木) 16:22:27.75 ID:yC4odKj7
フロントエンドで使えばDBをそのまま操作できるね
776NAME IS NULL:2014/11/27(木) 17:11:28.17 ID:???
データ分離して共有フォルダー配置で3〜4人程度ならAccessでも十分
777NAME IS NULL:2014/11/28(金) 00:09:35.10 ID:???
素人にACCESS勧めるなんて怖い事やめろよ
実際に見た事あるが地獄だぞ
778NAME IS NULL:2014/11/28(金) 00:52:57.64 ID:???
フロントエンドどうするのか知らんが
その代案がMySQLってか?
779NAME IS NULL:2014/11/28(金) 00:56:23.09 ID:???
薦めるなっていうけど、そもそも素人さんの一番近くにあるのがMS-OfficeのAccessだと思うけどなぁ。
780NAME IS NULL:2014/11/28(金) 13:37:17.80 ID:tkpwrtJQ
職場のOracleはデータ管理をアクセスでしてたな
781NAME IS NULL:2014/11/29(土) 01:32:58.03 ID:???
もはやGoogleスプレッドシートで良くね?
782NAME IS NULL:2014/12/01(月) 19:20:30.62 ID:TYW4z9TX
読書メーターみたいなamazonの本と連動しているようなサイトって、
管理者がいちいち本のデータを手入力したんだと思いますか。
それとも自動で吸い出しというかリンクさせるのだと思いますか。
不動産サイトやグルメ情報サイトでも、個々の情報を載せてくれっていう客の送ってきたデーターを
管理側でいちいち手入力しているんですか。それとも
783NAME IS NULL:2014/12/01(月) 19:32:47.23 ID:???
>>782
これで予想がつくかと。
http://bookmeter.com/help/?id=22
784NAME IS NULL:2014/12/01(月) 22:48:42.01 ID:???
共通属性と可変属性の定石のテーブル設計ってありますか?
785NAME IS NULL:2014/12/01(月) 23:22:46.79 ID:???
>>782
世の中にはWeb APIとかいうような類の便利なものがあってだな
786NAME IS NULL:2014/12/02(火) 00:27:28.83 ID:???
>>785
予想つかない。ソースを表示とかしても察しつかなかった。私は素人。バカです。

>>782
そうなんだ。APIっていうのがamazonのデータが流用できるようなパッケージなのかな。

難しいね。プログラマの人はみんなこういうことを当然のように知っているのね。
787NAME IS NULL:2014/12/02(火) 02:38:05.73 ID:???
APIはバックエンドの話だしな。
このスレに来るの早すぎるんじゃね?
788NAME IS NULL:2014/12/02(火) 03:10:55.97 ID:???
>>786
そうだね。
たとえばWindowsで動作するソフトウェアを作ろうとしたらAPIバイブルという本が必須の時代があった。
最低限必要な2冊を買うと2万円ぐらいかかったが。
つまり、APIがなんなのかは当然知っていたよ。

ハードルが低くなるということは、低レベルの知識が欠落したプログラマを生むことに他ならない。
789NAME IS NULL:2014/12/02(火) 03:17:03.18 ID:???
と、えらそうに書いたが、自分もアセンブラに関する知識は大雑把なものでしかないので、
やはり習得時期には既に先人によって甘い皮に包まれてしまっていたレベルの知識は欠落しているのである。
790NAME IS NULL:2014/12/02(火) 10:39:24.02 ID:???
>>784
rdb xml、rdb json、kvsでググれ
間違ってもc1、c2・・・はすんなよw
791NAME IS NULL:2014/12/02(火) 20:20:40.59 ID:???
>>790
NoSQLってやつ?
ニュースでは見るけど、実際に触ったことないなあ
ACID特性持たすのが大変ときいたが
792NAME IS NULL:2014/12/02(火) 21:34:48.11 ID:???
>>791
NoSQLに該当するのはkvsだけだな。
てか、しらないなら書かれてるとおりググれよw
793NAME IS NULL:2014/12/03(水) 12:55:40.79 ID:???
>>788
ポケベル→ケータイ→スマホ
スマホしか知らない小学生が、ポケベルもケータイも使ってからしか
立派なスマホアプリは作れないってこともないと思うんだけど
そういうこととは違うのか。
794NAME IS NULL:2014/12/03(水) 14:00:27.54 ID:???
ぜんぜん違うw
795NAME IS NULL:2014/12/03(水) 17:17:22.58 ID:???
>>794
どう違うの?うまく説明してみて。
796NAME IS NULL:2014/12/03(水) 17:50:35.83 ID:???
ポケベルには何の連続性もないだろ
ケータイも電話する部分を作るなら必要だがでんセに関係ない部分に連続性はない
797NAME IS NULL:2014/12/03(水) 18:14:15.72 ID:???
>>795
スマホにポケベル入ってるの
798NAME IS NULL:2014/12/03(水) 19:51:28.03 ID:???
そっか。
プログラミングは、古いものから進化してきた過程に連続性があるから
最初から全部勉強しなくては新しいのだけ見てもわからないということなんだね。
進化してきたということは、そうなる理由があったと思うから、最新のものを学べば、
一番手っ取り早いだろうと思ってたんだけど。
古参のプログラマーの人は、自分たちが通ってきた苦難の道を、新人が通らずにいきなり同じ到達点に来られるのが
なんか癪だから、わざと遠回りさせたがっているのかと思ったけど、違うんだね。
799NAME IS NULL:2014/12/03(水) 20:28:55.47 ID:???
>>798
頭悪いだろ
800NAME IS NULL:2014/12/03(水) 20:43:55.10 ID:???
ひらがな読み書きできないのに、いきなり漢字使わせられるようなもんだよ
801NAME IS NULL:2014/12/03(水) 23:47:45.24 ID:???
>>800
802NAME IS NULL:2014/12/03(水) 23:57:41.16 ID:???
こんなに便利になってんのになんで遺物みたいなのを大事にしてるかね
俺は指導側だがそんな今後使う必要が薄いとこは教えないなぁ
そこで詰まられても本当に時間の無駄だし
803NAME IS NULL:2014/12/04(木) 00:03:39.77 ID:???
> ハードルが低くなるということは、低レベルの知識が欠落したプログラマを生むことに他ならない。
欠落してるからダメだとは言ってない。
804NAME IS NULL:2014/12/04(木) 03:32:55.29 ID:???
SQLそのものはそれほどでもないけど
ホストアプリ側、とくにWindowsに限れば
開発環境と言語の進歩が低レベルなAPIを使う必要性を無くして行ってるからな
それでも変わった事やろうとするとAPI呼び出しに頼らざるを得ない事もあるにはあるが
全てのプログラマがWinAPI呼び出し必須だった時代なんてとっくに終わってる
805NAME IS NULL:2014/12/04(木) 05:08:52.97 ID:???
まるで誰かがWinAPIを含めた低レベルの知識がなければダメだと言ったかのような会話の展開だけど、どうしたの。
806NAME IS NULL:2014/12/04(木) 07:01:33.78 ID:???
>>805
>>788 が...
> ハードルが低くなるということは、低レベルの「知識が欠落したプログラマ」を生むことに他ならない。
って書いたからだろ。
807NAME IS NULL:2014/12/04(木) 12:35:54.37 ID:???
うわ、おもしれ。
「低レベルの知識」が欠落したプログラマ
なのに
808NAME IS NULL:2014/12/04(木) 12:58:02.91 ID:???
>>807
だから、曖昧なこと書くなよってことだよ
マジで説明が要るとは思わなかった
809NAME IS NULL:2014/12/04(木) 16:37:10.19 ID:???
文脈でわかると思うが
810NAME IS NULL:2014/12/04(木) 16:54:09.18 ID:???
言葉通り、低レベルな奴が増えてるのかもな
811NAME IS NULL:2014/12/04(木) 17:17:36.79 ID:???
低水準って言い方は根付かなかったね
812NAME IS NULL:2014/12/04(木) 17:25:20.57 ID:???
結局 >>799 が正解だったと。
813NAME IS NULL:2014/12/04(木) 17:36:04.01 ID:???
798だよ。自分は素人だから、質問も書いてることも頓珍漢で
頭悪く見えると思うけど、わかりたいから質問した。んで、わかった。
>>802のような考え方が自分は合理的だし好き。自分が習うならこの人に教わりたい。
低レベルな奴が増えてるんじゃなくて、このスレでは自分一人だと思います。
習うといっても、基本の本を端から端までとか、自分は待てない。
作りたいものを作りながら、聞きたいことが出たらちょこちょこ教わって早く結果が欲しい。
早くここの住人に追い付きたいよ。
814NAME IS NULL:2014/12/04(木) 17:41:32.81 ID:???
スレ違いどころか板違い。
根本的でかつ単純な判断すらできない素人なのはわかったよ。
815NAME IS NULL:2014/12/04(木) 17:57:52.43 ID:???
>>813
プログラマ板でアホどもとどうでもいい話でもしとけ
816NAME IS NULL:2014/12/04(木) 19:18:47.47 ID:???
>>811
そもそも低レベルと言う奴がおかしい
低レイヤーだろ
817NAME IS NULL:2014/12/04(木) 19:32:06.74 ID:???
low layer ではなく low level の話なのに?
818NAME IS NULL:2014/12/04(木) 19:43:25.53 ID:???
low level 君乙
819NAME IS NULL:2014/12/04(木) 20:13:32.60 ID:???
low-level programmingって言葉も知らない低レベルな奴が混じってるのか
820NAME IS NULL:2014/12/04(木) 21:10:47.56 ID:???
いいなあ、ここの人たちは。みんな自由自在に作りたいものが作れるのか。
グーグル地図に投稿するサイトとかも、簡単に作れるのか?
放射線量を投稿するサイトとか、ポストの位置を投稿するサイトとかあったろ?
ああいうのは、どやって作るん?素人には無理か?君らでも時間かかるのか?
そういうの作れる人と友達になりたかったら、どこにいったら会えるんかな。
821NAME IS NULL:2014/12/04(木) 21:14:11.64 ID:???
まず2chから離れろよ
822NAME IS NULL:2014/12/04(木) 21:41:00.62 ID:???
最低限このスレから離れろよ
823NAME IS NULL:2014/12/04(木) 21:49:19.56 ID:???
>>820
つてがなければクラウドソーシングを利用する
ただで作って欲しいという意味ならあきらメロン
824NAME IS NULL:2014/12/04(木) 22:50:12.20 ID:???
作って欲しいじゃなくて自分で作りたいん。
お金を払っても中身が自分にわかるように教えてくれるなら全然いいよ。
ちな、いくらぐらいでなら>>820みたいなの作って貰えるん?
825NAME IS NULL:2014/12/04(木) 22:52:29.10 ID:???
>>824
いくらぐらいなら出せるの?5万ぐらいとか?
826NAME IS NULL:2014/12/04(木) 23:26:02.41 ID:???
>>820
スレタイを声に出して10回読んでみろ
827NAME IS NULL:2014/12/04(木) 23:29:41.15 ID:???
出せる金額なんて言ったら、そら上限いっぱいまで所望されるでしょうよー。
5万円でちゃんとやってくれるん?
828NAME IS NULL:2014/12/04(木) 23:35:11.75 ID:???
>>827
やっぱり想定してる金額が相当少ないみたいだね。
5万だとどんなに優しく見積もっても1日で出来上がるシステムしか請けられないよ。
上で書いてるようなものなら、10倍用意して足りるなら御の字と思って。
829NAME IS NULL:2014/12/05(金) 00:16:55.98 ID:???
>>820 (^^) 怒られた 
>>828 そっか。50万円ぐらいは欲しいんだね。全然いいよ。
830NAME IS NULL:2014/12/05(金) 00:25:52.49 ID:???
俺だったら青天井で捻くれた根性叩き直せるまで金出させる
831NAME IS NULL:2014/12/05(金) 00:36:29.01 ID:???
なんなのこれ
832NAME IS NULL:2014/12/05(金) 22:09:27.55 ID:???
>>831
これほとんどが自演なんだぜ?
833NAME IS NULL:2014/12/05(金) 22:55:49.46 ID:???
…すごいな
834NAME IS NULL:2014/12/22(月) 21:22:44.32 ID:???
Nosql作ったことある人います?
うちの職場ではRDB以外受け入れてもらえないんだけど
835NAME IS NULL:2014/12/23(火) 23:04:24.71 ID:???
ひょっとしてDBに興味ある人って変な人ばっかりなの?
836NAME IS NULL:2014/12/23(火) 23:13:01.96 ID:wIV9jy1z
お前みたいな馬鹿でないことは確かだろうよ
837NAME IS NULL:2014/12/23(火) 23:17:15.11 ID:???
スキル無いのが集まってくるな
838NAME IS NULL:2014/12/23(火) 23:18:23.47 ID:???
「DBに興味ある人」

意味がいまいち分からないな。
839:2014/12/25(木) 19:35:28.04 ID:???
/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
    /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
    l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// ヽ::::::::::::::l
    l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::/:::「'ヽ::::::::::://   ヽ:::::::::::|
    |::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ノl:::ノ l:::::::/      ヽ::::::::|
   ノ:::::::::::::::::::::::::::::::::::::::::::::::::::::/ ゙゙  ノ:::/ ,,;;;;;;,,    ,,,,ヽ:::::l
   ):::::::::::::::::::::::::::::::::::::::::::::::/    ノ/ __,'''i: ('''__):::l  
  )::::::::::::::::::::::::::::::::::::::::::::::::::/         ̄ ̄ン:. :「 ̄`ヾ   
 1:::::::::::::::::::::::「 `┤l:::::::::::::::::l          ̄   ,  ヽ ̄ l   
  `l:::::::::::::::::::::ヽ  :l li:::::::::::::/        ヽ  /´   `l  |
  ヽ::::::::::::::::::::::\_」 lヽ::::/         .l  !:-●,__ ノ  /      
  ノ:::::::::::::::::::::::::::ノ | l `゙゙           i ,,;;;;;;;;;;;;;;;;;;;;,  /ヽ       
,/ ヽ::::::::::::::::::::::(  l l::::::::..         /.:''/´ ̄_ソ  /  `ヽ
     ヽ:::::::::::::::ヽ | l:::::::::::...      /::// ̄ ̄_ソ  /    \   ヴッ!!
        ヽ:::::::\| l::::::::::::::::...    / :::.ゝ` ̄ ̄/ /       ヽ
           ヽ:::l l:::::::::::::::::::..      ̄ ̄;;'' /         ヽ
              l l;;;;;;:::::::::::::::.....;;;;............;;;;;;''ノ            l
              l l '''''''''''''''''''''''''''''''''''''' ̄l |             |

http://www.youtube.com/watch?v=z2qK2lhk9O0
840NAME IS NULL:2014/12/26(金) 01:11:09.38 ID:???
>>834
作るって何?コードから?
使った、のtypoかな?
mysqlとredis併用でがんがん稼働中ですよ

NoSQL系はRDBがマッチしないケースに適用するものであって、受け入れられないってのは単に説明が足りないとかそもそも不要なんじゃない?

うちでの適用例だと、スマホゲーで永続化不要なリアルタイムPVPでredis使ってる
数分の間だけ桁違いなアクセスがあって、結果格納後はゆるゆると破棄される、みたいな奴です

RDBでもインメモリでチューンすりゃやれんことはないのかもしれないすけど、逆に言えば無理してRDBで実装する理由が無かった。正規化もjoinもいらないし、ただ淡々と行動ログを取って状況を配信し続けるだけなんで。
こんなんnodeあたりでアプリ側インメモリでも良いケースでもあるけど
841NAME IS NULL:2014/12/31(水) 14:13:36.57 ID:0K4PB+LJ
在庫管理って、基本は最後の棚卸から現在までの受払データのsumが現在の在庫になる、って方針だよね。

個々の受払のデータを持ってなくて、その都度商品マスタと1対1のテーブルに在庫数値を更新する、って方針はあまりないよね。
842NAME IS NULL:2014/12/31(水) 17:22:31.20 ID:???
昔のCOBOLのシステムだとそういうパターンもあったなあ
最新在庫問い合わせのレスポンスの問題で
ただ、その場合も受払の明細データはどっかに持ってる
843NAME IS NULL:2014/12/31(水) 19:48:16.77 ID:???
最新の在庫数持つよ
計算面倒くさい
844NAME IS NULL:2015/01/01(木) 00:44:16.68 ID:???
>>842
>>843

レスどもです。

確かに、毎回アクセスするたびにsumするのは負担がかかるから、更新時にsumして保存するのがよさそうですね。

今やってるシステムは、受け払いの履歴をもってないんだよな。。。。
845NAME IS NULL:2015/01/01(木) 00:45:59.06 ID:???
テーブル名付けるときって、何文字以下にするみたいなこと考えてやってる?
内容を正しく表すことと、他のテーブル名との一貫性をきれいに保たせようとすると、どうも長くなってしまいがちなんだが
846NAME IS NULL:2015/01/01(木) 03:05:53.17 ID:rJHa5+se
今だとKVSにSUM入れて推移はRDB管理がよろしいかと
847NAME IS NULL:2015/01/01(木) 12:03:49.22 ID:???
古いDBは6文字短縮名が多いので可能な限り合わせてる
ERDの論理名は冗長やけどね
新しいプロジェクトだと短縮名英字テーブルに全部冗長な日本語名のビュー被せてる形式
その際は文字長の制限無し
848NAME IS NULL:2015/01/01(木) 12:37:40.19 ID:MgTOS1zH
>>846
なるほどです。
849NAME IS NULL:2015/01/01(木) 12:49:25.02 ID:???
>>845
文字数制限厳しい糞DBMSならそこに納めないといかんが、
そうじゃないなら好きにしろ。
プログラムコードの識別子と同じで無理に省略はしなくていい。
850NAME IS NULL:2015/01/04(日) 09:27:34.18 ID:???
ただあんまり長いとSQL文読みにくいけどね
851NAME IS NULL:2015/01/04(日) 13:44:21.19 ID:???
エイリアスで解決
852NAME IS NULL:2015/01/05(月) 00:54:38.64 ID:mqBMdeHj
そりゃ当然エイリアスは使うさ。
でも一度は記述しないといけないわけで
853NAME IS NULL:2015/01/05(月) 07:33:16.86 ID:???
>>852
読みやすさの話なんだけど...
854NAME IS NULL:2015/01/05(月) 14:07:10.94 ID:???
>>852
単にスコープの問題。業界にいるならそれくらい理解できないとやばくね。
855NAME IS NULL:2015/01/05(月) 14:23:48.27 ID:???
長さの程度問題じゃ?
856NAME IS NULL:2015/01/05(月) 14:55:22.09 ID:???
長いか短いかはともかく、桁数そろえたくならない?
857NAME IS NULL:2015/01/05(月) 15:14:25.22 ID:???
SQL1発で何でも解決したくなる病にかかるやつが多いから
ほっとくとすごいことになるんだぞw
858NAME IS NULL:2015/01/05(月) 15:37:23.57 ID:???
>>856
そういう人は芸術家になればいいと思う
859NAME IS NULL:2015/01/05(月) 23:35:32.74 ID:???
>>856
全然ならん
プレフィックス付けたい病だが…
860NAME IS NULL:2015/01/09(金) 00:04:59.68 ID:???
クラ鯖アプリの添付ファイルのExcelをOracle SecureFilesかなんかのBLOBに突っ込むのって最近流行りですかね?

RAC組んでてDBは冗長化されてて、添付ファイル用に冗長化したファイルサーバ立てるのもアホらしいし
どんなに大きくファイルサイズを見積もっても 1年で1GB程度しかファイルが添付されないから無難な方法かなーと思ったり。
861NAME IS NULL:2015/01/09(金) 08:06:54.40 ID:???
>>860
流行りかどうかは知らんけど、普通にやられてるでしょ
バックアップとかもその方が楽だし
862NAME IS NULL:2015/01/09(金) 10:57:55.61 ID:???
>>860
普段から個別に使いたいならやらないが、一元化って意味ではありやろ
863NAME IS NULL:2015/01/25(日) 10:15:05.33 ID:CkJSYlpG
就活の資料の一環として大学で実際の仕様に基づくDB設計を作ります。
自分は求人サイト(リクナビとか)向けの設計を作る事になったのですが、
それで気になることがあるので、質問です。

大体どの求人サイトも会員登録→履歴書作成→求人応募
という仕組みだと思うのですが、求人応募の際に履歴書の内容を
応募した求人毎に保存するべきなのか否か悩みます。

考え方として、
必要)その都度、履歴書の内容は変わるので、応募毎に保存するべき。
不要)履歴書として登録してるテーブルを、応募後に参照させればいいだけ。

正規化の考えから、同じ値を何度も登録させるのはおかしいと思いつつ、
応募時期によって履歴書の内容は変わったり職歴が追加されたりするので、
応募時点の情報を閲覧出来た方が企業としては良いのかな?と思ったりします。

なにぶん、自分は就活前なのでそういった求職者・雇用者の利用方法が想定できません。。
なので、どう設計したらいいか悩むところです。
求人サイトを設計した事がある方がいましたら、アドバイスください。お願いします。
864NAME IS NULL:2015/01/25(日) 10:55:14.86 ID:???
固定部分は一つ、履歴書部分は別にナンページも付けられるようにすりゃいいじゃん
一つのテーブルでなんでもやろうとするのが間違いの始まり
865NAME IS NULL:2015/01/25(日) 12:31:40.86 ID:???
>>863
分けた方がいいですね
理由としては常に同じ値になる訳では無いから
※「応募時期の〜」の考え方でOK

ただし、履歴書の変更修正も残したいなら下みたいな感じのが良いかと
※応募の有無に関係無く履歴を残したいとか

会員テーブル(会員ID
求人会社テーブル(会社ID
履歴書テーブル(会員ID,履歴書No
応募履歴テーブル(応募時期,会社ID,会員ID,履歴書No

履歴書の変更修正が不要なら履歴書Noが無くなり
応募の度に応募履歴テーブルへ履歴書の内容を記録

正規化は経験者でも悩ましいところですが、まず細かい仕様(どのデータをどう利用する)を確定していく事ですね
866863:2015/01/25(日) 17:06:48.43 ID:CkJSYlpG
>>865
かなり詳しく教えていただきありがとうございます!

自分の中で
「応募の度に応募履歴テーブルへ履歴書の内容を記録」
というのが凄く違和感を感じていたんです。

求人サイトでは履歴書とか職務経歴書とかスキルシート?とかあるのに、
1企業に応募する度に複数テーブルに追加していくのは冗長すぎないか?と。

でも、おっしゃるように常に同じ値になるわけではないし、
1企業が1応募者の人生(履歴)をずっと見られるのも、おかしいですからね。
応募時期によって履歴書の内容が変わる、
それを保存するという考え方で問題ないのかもしれません。

テーブルや登録値を減らすことばかり考えていましたが、
それが良いとは限らないんですね。大変参考になりました!
867NAME IS NULL:2015/01/25(日) 20:43:07.22 ID:???
>>863
テーブル設計以前の要求定義の話だな

>正規化の考えから、同じ値を何度も登録させるのはおかしいと
たとえば提出先毎に内容を保存できるって要件なら
複数に提出した内容がまったく同じだったら
(内部的に識別できるコード類は違うだろうが)
同じデータが複数あってもそれは正規化されてない事にはならん
868NAME IS NULL:2015/01/25(日) 21:36:08.57 ID:???
会社でサーバーOSのグレードアップに伴ってDB移行しなくちゃいけないんだけど、
DB移行計画書はどんくらいのボリュームが適正かしら?
ちな、250人程度の中小企業で、データ数は20万くらい。
やっぱ端折らずに全部計画書に落とすべきかなぁ・・・
869NAME IS NULL:2015/01/25(日) 23:23:10.77 ID:???
>868だけど、俺の質問はなかったことにしてください。
ごめんなさい。
870NAME IS NULL:2015/02/05(木) 15:45:04.43 ID:???
期間で管理する
履歴付きマスターテーブル群を、
性能を落とさずに扱う方法はないでしょうか?
ある期間断面を切りとって、
トランザクションデータとJOINして、
断面単位で集計できるような構造。
871NAME IS NULL:2015/02/05(木) 18:04:25.11 ID:???
>>870
ほんとに性能落ちてるのか?
落ちてると思い込んでるだけじゃないのか?
872NAME IS NULL:2015/02/05(木) 18:30:34.45 ID:???
何も気にせずトランザクションとマスタを結合して断面としたいgroup by書けば終わる話ではないってことなんだろうなぁ
873NAME IS NULL:2015/02/05(木) 18:43:31.22 ID:???
マスタを検索するときに、some_date between master.available_from and master.available_toってするんじゃないかな
874NAME IS NULL:2015/02/05(木) 19:36:31.64 ID:???
期間でパーティショニングとかそういう話じゃ
875NAME IS NULL:2015/02/06(金) 10:25:52.87 ID:???
どういう理由で性能が落ちると思ってるのか、あるいは現状落ちているのかを説明してくれないと答えようがない。
876NAME IS NULL:2015/02/06(金) 10:36:30.05 ID:???
OLAPの話なのかなぁと思ったりシましたが
877NAME IS NULL:2015/02/06(金) 21:57:54.20 ID:???
User(userid int unsigned not null primary key);
Follow(follower int unsigned references User(userid),
followee int unsigned references User(userid));
って設計ダメなんですか?
878NAME IS NULL:2015/02/07(土) 00:15:25.79 ID:???
なんで?
879NAME IS NULL:2015/02/07(土) 00:45:48.73 ID:???
jpaで関係作れないんですよ
880NAME IS NULL:2015/02/07(土) 11:26:46.85 ID:???
>>870
履歴は量が多いなら別テーブルにすれば?
出なければ日付index
881NAME IS NULL:2015/02/07(土) 18:46:41.23 ID:???
テーブルが恐ろしい量で切るな
官公庁見たく5年で廃棄だと5年分のテーブルがずらりと並ぶ事に鳴る
週単位で作っても350テーブルとkwww
882NAME IS NULL:2015/02/08(日) 00:41:13.61 ID:???
意識したことなかった
MySQLで週別、日別なログを回してて7万テーブルほどあるけど別に問題ないです
あえて言えばphpMyAdminが挙動おかしくなったので封じたけど
883NAME IS NULL:2015/02/08(日) 01:38:22.61 ID:???
PARTITIONで分けちゃえばいい
884NAME IS NULL:2015/02/08(日) 02:44:08.15 ID:???
日ごとに分けるって、1テーブルどれくらいのレコードになるの?
885NAME IS NULL:2015/02/08(日) 12:21:58.11 ID:???
なんで日付事にテーブル作るって思う(笑)
マスターと履歴マスター
履歴もアクセスする事があるなら、履歴には最新も入れときゃいい。
886NAME IS NULL:2015/02/08(日) 15:00:50.25 ID:???
日付ごとで別テーブルって、過去データの検索とかわざわざunionするのか?
7万テーブルのunionとか想像だにできん
887NAME IS NULL:2015/02/08(日) 16:24:21.22 ID:???
日またがりの検索をしない前提なんじゃないのかなぁ。
日別のテーブルを作らざるを得ないほどのデータ量ってストレージも大変なことになってそう
888NAME IS NULL:2015/02/08(日) 16:26:37.66 ID:???
業務要件が分からんから何とも
普通にindex張ってもダメなら、もうデータ分けちゃえ
889NAME IS NULL:2015/02/08(日) 19:35:47.21 ID:???
そう言うときのためにパーティションングって技術があるわけだが
890NAME IS NULL:2015/02/08(日) 21:58:31.67 ID:???
そもそもマスタかが疑わしい
891NAME IS NULL:2015/02/09(月) 15:27:52.70 ID:???
パーティショニングて実際に使った事無いんだが、それなりに安定するの?
892NAME IS NULL:2015/02/09(月) 16:02:03.09 ID:???
パーティショニングのどこに不安定の要素があるんだ?
893NAME IS NULL:2015/02/09(月) 20:02:55.48 ID:???
使った事無いから不安なの
特にどこがという事は無いけど
894NAME IS NULL:2015/02/09(月) 21:05:23.78 ID:???
初めてだから優しくしてね…ウフッ  て言えばぁ?
895NAME IS NULL:2015/02/10(火) 02:58:10.51 ID:???
パーティショニングは実用に耐えんかったby適当にいじって負荷テストでサーバ落として上司に詰められた無能

俺のことだ
パーティショニングさんほんとすまん
なんか1日で成果出せなければ死ねとか言われたんだ
実際には三日かかって成果出せなかった
それでも私は元気です

日跨りの検索案件も、毎日数件程度ながらあります
ダンプしたのをvirtualboxに移してから回してます
今まだ回してます
896NAME IS NULL:2015/02/10(火) 03:45:01.36 ID:???
適切な対応を取れば最悪数秒で結果が出るような酷い状況じゃないことを祈るよ。
897NAME IS NULL:2015/02/10(火) 06:02:53.64 ID:???
>>895
実機で負荷テストはダメやろw
日付跨いでパーティショニングされるとしたら夜中だろうし
898NAME IS NULL:2015/02/10(火) 10:33:13.03 ID:???
>>896
ほとんどはこれだよな
899NAME IS NULL:2015/02/10(火) 13:01:58.60 ID:???
時系列をidとしたレコードにtrue とfalseを登録する。
そして、それらの最大連続true回数を調べたいのですが、sqlで取ってくることは可能ですか?

連続数をデータベースに登録しておくべきでしょうか?
900NAME IS NULL:2015/02/10(火) 16:11:29.46 ID:???
>>899
サブクエリを工夫してもできるし、ストアドファンクションが使えるDBMSならそっちでもできるはず
連続数の登録はレコード更新の競合とか面倒臭そうだから勧めない
901NAME IS NULL:2015/02/10(火) 18:38:50.77 ID:???
>>900
ありがとうございます。
野球の打撃成績の管理を頼まれまして、
クエリでなんとか拾ってみます
902NAME IS NULL:2015/02/10(火) 19:02:59.15 ID:???
nulldataでも作ってるのかな
903NAME IS NULL:2015/02/10(火) 19:07:57.03 ID:???
「1つ先がfalseである、trueのレコード」に対して、
「そのレコードより前かつ1番近いfalseのレコード」
以降からそのレコードまでのレコード数を集計すればいいと思う
最大数を求めたいなら、その結果レコードを更に集計

最初や最後のレコードがtrueの場合も集計できるよう工夫して
904NAME IS NULL:2015/02/10(火) 19:56:15.24 ID:???
自分で適当に書いたらややこしい感じになったのでネットに頼った結果、先人は偉大だと思い知り。
引き出しに入れておこう。
https://yone64.wordpress.com/2013/07/04/
905NAME IS NULL:2015/02/13(金) 02:25:06.50 ID:???
独学でプログラムではじめた頃、インデックスすら知らず、
パフォーマンスが出ないためにテーブル分けまくってたのを思い出したわw
906NAME IS NULL:2015/02/13(金) 23:43:22.23 ID:iHKHG1yp
管理者と会員のやりとり(メッセージ)を保存して一覧表示させたいと思います。
その場合の設計を考えたのですが、
「管理者ID、会員ID、タイトル、内容、送信日」
というのは変ではないでしょうか?

というのも会員がメッセージを投稿した場合、管理者IDはNULLになります。逆もしかりです。
かと言って管理者・会員のIDが分かれているので、こうするしかない気がします。
どうするのがシンプルでオーソドックスでしょうか?
907NAME IS NULL:2015/02/14(土) 00:46:17.44 ID:???
メッセージID、管理者ID、会員ID、タイトル、内容、送信日
908NAME IS NULL:2015/02/14(土) 01:56:45.93 ID:???
管理者と会員の区別って必要なのか
管理者=会員ID0とかにすれば要らないような
909NAME IS NULL:2015/02/14(土) 02:29:27.88 ID:???
管理者と会員に分けず、利用者として一つにまとめ、会員か管理者かは、利用者マスター的な所で区分値もしくはブール値のフラグを持たせたらどうでしょう?
910NAME IS NULL:2015/02/14(土) 02:35:48.88 ID:???
>>906
普通はこうやる

メッセージテーブル
送信日、メッセージNo、送信者ID、受信者ID、タイトル、内容

利用者テーブル
利用者ID、利用者情報…
911NAME IS NULL:2015/02/14(土) 03:21:24.37 ID:???
なんだろう。
メッセージID、親メッセージID、利用者ID、タイトル、内容、送信日
1 null user_1 質問です 困ってます 2015/2/1
2 1 admin_1 そうですか 大変ですね 2015/2/1
3 2 user_1 うわあん もうこねえよ 2015/2/2

という感じでツリー表示したいわけではないのかな。
912NAME IS NULL:2015/02/14(土) 07:04:15.19 ID:???
そもそも>>906は書くべき情報が不足していて良くない
まず関係するテーブルの定義は簡単にでも一通り挙げるべき
具体的には管理者テーブル・利用者テーブルの定義が足りない
あと、DBMSとバージョンも書けば各DBMS固有の解決法もあるかもしれない


今回は管理者/利用者テーブルの定義に関してはこっちで予想した上で、特にDBMSに依存しない回答を書くと
メッセージテーブルと管理者/利用者テーブルの間に、メッセージ投稿者テーブルを噛ませたら良さそう

メッセージテーブル
{投稿番号(PK),投稿者ID(FK),タイトル,その他メッセージ情報…}

メッセージ投稿者テーブル
{投稿者ID(PK),ハンドル(ネーム),その他投稿設定…}

管理者テーブル
{管理者ID(PK),投稿者ID(FK),その他管理者情報…}

利用者テーブル
{利用者ID(PK),投稿者ID(FK),その他利用者情報…}
913NAME IS NULL:2015/02/14(土) 09:36:32.23 ID:???
FK貼ると会長はずっと会長やらないと…
914NAME IS NULL:2015/02/14(土) 09:50:17.00 ID:???
>>906
> 管理者・会員のIDが分かれている

これが必須要件ならそのままが一番シンプルだと思う
ここを変えていいなら他の人が言ってるように管理者と会員を一つのテーブルにして、フィールドに管理者か会員の区別をつければいい

ちょっと気になったのは
> 管理者と会員のやりとり
って一つでいいの?
2ちゃんのスレッドみたいな概念は要らないの?
915NAME IS NULL:2015/02/14(土) 09:59:40.79 ID:???
>>912 に賛成

ただもし、管理者テーブルや会員テーブルが既に別システムで定義されている場合、
投稿者テーブルで集約することはできなくなる。

その場合、投稿者ビューとして集約し、管理者ID+α、会員ID+αで一意化する必要がある

αの部分として、

投稿者として別の情報を付与するなら投稿者テーブルを作り投稿者IDを使う。
管理者、会員と投稿者の関係はそれぞれ交差テーブルを作る。

もしくは単純に区分値を与える。
916NAME IS NULL:2015/02/14(土) 10:10:35.21 ID:???
>>915 について、
「既に管理者テーブルと会員テーブルがあるのなら、そこに投稿者IDつければいいじゃん」という考える人がいるかもしれない。

コンテキストの規模によるため一概に言えないが、「One fact in one place」の原則から、会員管理と投稿管理は別コンテキストとかんがえ別テーブルとした方が、後々の機能拡張にも手を出しやすくなると思う。
917906:2015/02/14(土) 10:46:33.77 ID:K+3vnnrF
皆さん回答ありがとうございます。ちょっと自分には難しい説明が多々あるので、
理解できそうな部分だけ掻い摘んで返信します。

>管理者と会員の区別って必要なのか
必要です。設計が違います。
管理者テーブルは単純に「管理者ID、表示名、ログイン名、パスワード、権限」ぐらいですが、
会員テーブルは「名前、性別、生年月日、住所」などのプロフィールが入っています。

なぜプロフィールと会員情報を1本化したかというと、1対1の関係であり、
正規化するほどでもないので、1つのテーブルにまとめてます。
(これは過去にこのスレでアドバイス頂いた設計でもあります)

>>911
基本的にはそのような単純な表示を想定しています。

>>912
かなり詳しくありがとうございます。ただ、PKとかFKとかの意味が理解できないので、この後勉強します。

>>914
スレッドみたいな概念は考えていません。単純な連絡用ですので。

レス頂いた分を見ると、皆さんが引っかかっているのは
「会員テーブルと管理者テーブルが別の意味がわからない」だと思います。
上記の通り、別のテーブルとして定義しているため、「投稿者ID」とするのではなく、
別カラムとして用意する案を考え、>>906となりました。説明不足ですみません。
918906:2015/02/14(土) 11:04:16.03 ID:K+3vnnrF
>>912さんの言ってる意味がわかりました。PKって主キーの略語だったんですね・・。
「管理者と会員でテーブルが分かれてるから、新たに投稿用の会員テーブル?を作る」
として、”投稿者テーブル”とする意図も分かりました。
そういう考えをした事がなかったので、新たな発見です。

ただ、>>916さんが言うように既存のテーブルに新たに投稿者IDを追加するというのは
どうなのか?と思うので、それなら単純に管理者ID・会員IDを使った方が良い気もします。

色んなやり方・考え方があり難しいですが、もう少し勉強します。
919NAME IS NULL:2015/02/14(土) 14:22:07.79 ID:???
PKとかFKとかが難しいっていうのにDB設計?
920NAME IS NULL:2015/02/14(土) 15:23:59.21 ID:???
>>919
まあまあ、最初はみんな初心者ですから
921906:2015/02/14(土) 16:20:03.29 ID:???
>>919
いえ、普段そういう言い方しないもんで。
922NAME IS NULL:2015/02/15(日) 21:28:37.18 ID:RML1uFu9
サービスを利用したら課金が発生して、月末(または指定日)にまとめて請求するような仕様を考えています。
イメージとしてはヤオフクです。出品とか落札手数料とかオプション使用で課金されて、月末に支払うみたいな。
その場合のテーブル設計として

◯課金テーブル
課金ID|請求ID|ユーザーID|内容|金額|課金日

◯請求テーブル
請求ID|ユーザーID|金額|請求日

◯支払いテーブル
支払いID|ユーザーID|請求ID|支払い方法|支払日

といった設計でおかしくないですかね?支払いテーブルと請求テーブルを一緒でも良い気はしますが。
923NAME IS NULL:2015/02/15(日) 23:20:38.55 ID:???
>>922
請求と支払いの関係が1対1なら1テーブルに纏めるのがいいね
で、課金テーブルを分けないとダメな気がするが

オプションA、B、C等の課金料設定テーブルとユーザーが実際に利用したオプションの課金利用テーブル
課金設定テーブルのPKは課金ID
課金ID、オプション名、金額、備考

課金サービス利用テーブルのPKは請求ID
請求ID、課金ID、金額(金額変わる可能性があるからここでも持つ)
924922:2015/02/16(月) 00:27:09.16 ID:???
>>923
返信ありがとうございます。
「課金サービス利用テーブル」が中間テーブルのようなイメージですが、
一度課金したのに金額が変わる可能性って無いと思います。
んでも、請求IDがPKってのはどうなんでしょ?違うような気も・・。

とりあえず、まとめると以下の感じだと収まりが良いですかね?

◯サービステーブル
サービスID|サービス名|金額

◯課金テーブル
課金ID|サービスID|ユーザーID|金額|課金日

◯請求テーブル
請求ID|ユーザーID|金額|請求日|支払い方法|支払日

◯課金サービス利用テーブル
請求ID|課金ID

Aさん(ID5)が「サービス名:出品(ID3|500円)」を利用したら、
課金テーブルに「1|3|5|500|2015/02/16」が入って、翌月の請求時に
課金サービス利用テーブルには「1|1」が入り、
請求テーブルには「1|5|500|2015/03/01|銀行振込|NULL」が入ると。
うーん、この考え方で良いのかなぁ
925NAME IS NULL:2015/02/16(月) 05:03:23.35 ID:???
>>924
請求と課金が1:nなら、課金テーブルに請求ID持ったほうが
請求締め処理やるときに楽だぞ

請求テーブルにユーザーIDと金額が必要かどうかは良く検討した方がいいぞ
複数のテーブルに「金額」っていう同一の項目名つけるのもやめた方が良い
926922:2015/02/16(月) 09:16:11.73 ID:???
>>925
ありがとうございます。中間テーブルも必要ない気がしますので、
以下のようにまとめることにしました。

◯サービステーブル
サービスID|サービス名|料金

◯課金テーブル
課金ID|請求ID|サービスID|ユーザーID|金額|課金日

◯請求テーブル
請求ID|ユーザーID|小計|消費税|請求日|支払い方法|支払日
927NAME IS NULL:2015/02/16(月) 10:17:37.96 ID:???
ユーザーIDのマスターは別にあるという前提?
928NAME IS NULL:2015/02/16(月) 12:07:55.28 ID:???
>>924
だから、その課金と請求って 1:1 なの?
1:1 なら課金と請求を一つにまとめるべきで、テーブル名も 利用テーブル とか、取引テーブル とかにした方がいいと思う
俺なら
◯取引テーブル
取引ID|サービスID|ユーザーID|課金金額|課金日 | 請求金額 | 請求日 | 支払い方法 | 支払日 |
にするかな

常にサービステーブルの金額が課金金額と請求金額になるなら、課金金額と請求金額は不要
(変わる例としては、特定ユーザーのみ割り引くとか、キャンペーン中なので請求金額のみ割り引くとか
あと途中で値上げ/値下げした時に、その切り替わりの処理を考慮する必要がある(サービステーブルそのまま書き換えると、課金した時と請求する時で金額が違うとかなるから))

> Aさん(ID5)が「サービス名:出品(ID3|500円)」を利用したら、
1|3|5|500|2015/02/16 | 500 | Null | Null | Null |

> 翌月の請求時に
1|3|5|500|2015/02/16 | 500 | 2015/03/01 | 銀行振込 | Null |
929NAME IS NULL:2015/02/16(月) 13:09:37.15 ID:???
最初のレスを読む限り、請求は月イチ、課金は随時なんでないの。
複数の課金をまとめて請求って形。
930NAME IS NULL:2015/02/16(月) 13:31:29.39 ID:???
最初のレスに
>イメージとしてはヤオフクです。出品とか落札手数料とかオプション使用で課金されて、月末に支払うみたいな。
と書かれてるな。
931NAME IS NULL:2015/02/16(月) 16:17:14.99 ID:???
その直後に
> 請求と支払いの関係が1対1なら1テーブルに纏めるのがいいね
というレスした人ががんばってるのが現状だよね。
932NAME IS NULL:2015/02/16(月) 17:00:58.29 ID:???
>>928
> 1:1 なら課金と請求を一つにまとめるべきで、
たとえ1:1でも、そうすべきなんてちっとも思わないけど。
933NAME IS NULL:2015/02/16(月) 18:09:50.26 ID:???
>>932
理由は?
934NAME IS NULL:2015/02/16(月) 18:43:44.78 ID:???
>>933
> 理由は?
自分は一つにまとめるべき理由は語らないのに、人には聞くの?

逆に聞くけど、これコード書くとき、課金クラスとか請求クラスとか支払いクラスとか一切無しに、
全部入りの取引クラスとか作っちゃうの?
935NAME IS NULL:2015/02/16(月) 19:24:05.28 ID:???
>>934
普通に分ける選択肢と分けない選択しがあって理由がないのに分けるの?
あと、レコードのフィールドと操作クラスになんの関係があるんだ?
936NAME IS NULL:2015/02/16(月) 19:58:25.61 ID:???
分ける理由は書かれてるが
937NAME IS NULL:2015/02/16(月) 20:24:19.45 ID:???
そもそも1:1じゃないんだから、まとめるまとめないの話は無用じゃないか?
別の話に切り替えたいならそれでもいいけど
938NAME IS NULL:2015/02/16(月) 20:25:55.92 ID:???
>>936
クラスがどうのこうのの事を言ってるの?
全然理由になってないと思うけど
939NAME IS NULL:2015/02/16(月) 21:07:53.45 ID:???
データをどう分割するかの観点では同じようなもんじゃないか
940NAME IS NULL:2015/02/16(月) 22:18:10.95 ID:???
データモデルの観点から言えば、1:1の関係を別テーブルに分けたら1:0..1か0..1:0..1に
なっちゃうんだよな。トリガなんかで保証しない限り。
941NAME IS NULL:2015/02/16(月) 22:24:59.89 ID:???
>>939
ひょっとしてビューも知りませんとか?
942NAME IS NULL:2015/02/17(火) 00:41:14.37 ID:???
>>931
今帰宅…違う人っす(^◇^;)

他の人が書いてるけど理由無くどんどん分けるのは良くないでしょ
あと、>>934の人はちょっと意味不明ですね
943NAME IS NULL:2015/02/17(火) 01:22:05.72 ID:???
そもそも質問者の要件定義が1対多なんだから、それを前提にすればいいじゃん。
どうして1対1を検証しようとするのかが分からん。
944NAME IS NULL:2015/02/17(火) 01:24:12.19 ID:???
ここって定期的に回答側に質問者レベルが混じってる
945NAME IS NULL:2015/02/17(火) 02:33:50.71 ID:???
ファミレスの案件で言うと
先にドリンクばーだけ頼んどいて後から料理で注文取り消しの処理が入る事に鳴るけどな
もちろん取り消し確認しなきゃ成らないから速度がた落ちw

最後はオンメモリオラクルで力技で逃げ切ったけど後シラネw
946NAME IS NULL:2015/02/17(火) 03:43:33.04 ID:???
>>941
安価ミスだと信じてるんだけど、大真面目な可能性を捨てきれないこのスレがちょっといやだ
947NAME IS NULL:2015/02/17(火) 05:00:50.34 ID:???
>>946
なにか言いたいことがあるならちゃんと書けばいいのでは?
948NAME IS NULL:2015/02/17(火) 05:17:02.86 ID:???
>>943
請求と課金は1対多だけど、請求と支払いは質問者も言ってる様に1対1だろ
949NAME IS NULL:2015/02/17(火) 05:38:14.66 ID:???
>>944
技術板ってどこもそんなもんだろ
覚えたてで口出したいだけ
950NAME IS NULL:2015/02/17(火) 06:34:46.46 ID:???
>>940
請求をした時点では支払いがないから、もちろん1:0..1だなぁ。
951NAME IS NULL:2015/02/17(火) 06:38:43.83 ID:???
>>947
>>939>>938あてだよ
952NAME IS NULL:2015/02/17(火) 07:05:03.53 ID:???
俺は>>932じゃないけど
請求と支払いは俺にとっては別の概念だから
俺なら1:1だろうが別テーブルにするがな
システム的な理由なら
更新時のロック範囲とか検索時のパフォーマンスとか

請求と支払いが同一の概念だと思うなら一つにすれば良いんじゃない
請求〆処理や入金処理でロック待ち多発する可能性はあるけど
953NAME IS NULL:2015/02/17(火) 10:04:12.24 ID:???
952が正しいわ。請求がキャンセルされる可能性もあるし、支払予定が変わる可能性もある。
それを1つのテーブルでやってたら無駄だわ。

だから請求は請求テーブル、支払いは支払いテーブルにまとめるという概念で
あとはサイトの規模・更新頻度や要件などを考えみて、どう設計するかだろ。
954934:2015/02/17(火) 10:14:17.52 ID:???
>>942
> あと、>>934の人はちょっと意味不明ですね
>>934の後半は、アプリケーション側のドメインモデルを抽出するとき、あるいは、ビジネスロジックモデルを
抽出するときに、課金・請求・支払いを分けたいと思う動機があるとすれば、それはリレーションモデルの
エンティティ抽出にも言えませんか、っていう流れにしたかったのね。

>>940
> データモデルの観点から言えば、1:1の関係を別テーブルに分けたら1:0..1か0..1:0..1に
> なっちゃうんだよな。
俺がまとめるべきとは思わない理由の一つもそれ。
先にまとめるべきだと思う理由を聞きたかったから、それは言わなかった。話がまぎれる可能性があるし。

課金・請求・支払いに限らず、時系列で発生するものは、1:1ではなくて1:0..1になる。
そのとき、テーブルが一つだとNULLの嵐になるというのがどうかという問題だね。
NULL撲滅委員会みたいな原理主義者なら、それは絶対にNoだと言うかも。
955934:2015/02/17(火) 10:18:44.37 ID:???
>>952
> 請求と支払いは俺にとっては別の概念だから
それが分ける派の素朴な理由だと思う。
そう思う派にとっては、今回のケースは「分割する話」ではなくて「合成する話」となる。
合成すべき派がいるなら、なぜそう思うのか理由が知りたいんだよなぁ。
956NAME IS NULL:2015/02/17(火) 10:42:54.63 ID:???
質問があります。
使用するDBは、SQL Serverです。
とある機器から1分毎にデータを収集しています。
フィールドは次のようになっています。
-----
日時
メーター1
メーター2
 ・
 ・
 ・
メーター100
-----
これを日毎に集計し、1つのメータに対して
平均値、最大値、最小値を求め、1レコードにし別テーブルに格納したいです。

このとき、
・300フィールドを用意したテーブルに格納するか
・メータ別にテーブルを作成するか
どちらのほうが良いのでしょうか?
957NAME IS NULL:2015/02/17(火) 10:47:01.71 ID:???
>>956
メーター数に増減があった時に、どうなるかを考えてみよう
958NAME IS NULL:2015/02/17(火) 10:56:12.94 ID:???
>>957
そこまで考えが及びませんでした、
フィールドを増減させるのは大変ですね。

メータ別にテーブルを用意します。
ありがとうございます。
959NAME IS NULL:2015/02/17(火) 11:16:36.90 ID:???
テーブルを増減するというのも大変だと思うんだが
増減の都度、その後のSQLソースを修正するつもりなのか?
960NAME IS NULL:2015/02/17(火) 11:24:54.67 ID:???
測定データ: {日時, メーターID, データ}
集計データ: {日時, 平均値, 最大値, 最小値}
がいいんじゃないかな。
961956:2015/02/17(火) 11:54:12.84 ID:???
>>959
どちらにしても、フィールド数もテーブル数も多くなるなとは思いました。
集計テーブルに、メータを10個x10テーブル分とも考えましたが
中途半端になるような気がしたので、どちらかにする。と決定し、
質問させてもらいました。

メータが増減するとなった場合、機器の取り外しや据え付けも必要だし
頻繁には行わないので、その都度SQLを修正します。

>>960
測定データは、どうしても[日時、メータ1〜」のテーブルに格納します。
というか、収集ソフトの仕様でされてしまいます。
962NAME IS NULL:2015/02/17(火) 11:56:27.17 ID:???
>>961
それはViewで対応したら?
963NAME IS NULL:2015/02/17(火) 19:14:05.67 ID:???
>>961
データの横持ちは、破滅を招くよ。なるべく避けるのが吉。
横持ちが何かわからなかったらググるべし。

> というか、収集ソフトの仕様でされてしまいます。
データ収集ソフトがデータベースに登録するってこと?
964NAME IS NULL:2015/02/17(火) 19:22:45.64 ID:???
>>963
それくらい読み取ろうよ
965NAME IS NULL:2015/02/17(火) 19:26:15.62 ID:???
ま、収集ソフトの仕様でそうなってるなら、トリガで縦持ちテーブルに転記するのもいいかもね。
縦持ちにしておけば他の何かしたいときにも便利でよい。
966NAME IS NULL:2015/02/17(火) 20:13:50.24 ID:???
>>952
> 請求と支払いは俺にとっては別の概念だから
> 俺なら1:1だろうが別テーブルにするがな

まじでこんな考えの奴がいるのか
スゲーな

> 請求〆処理や入金処理でロック待ち多発する可能性はあるけど

どんだけ大規模なシステム想定してるんだよ

> 952が正しいわ。請求がキャンセルされる可能性もあるし、支払予定が変わる可能性もある。

そういう履歴も持ちたいと言うなら既に要件が変わってる
普通はキャンセルフラグ、予定日の更新等で対応
967NAME IS NULL:2015/02/17(火) 20:17:09.62 ID:???
>>965
規模によるけどビューの方がいい
968NAME IS NULL:2015/02/17(火) 20:18:35.66 ID:???
>>951
で?
いちいち面倒だから言いたいことあるなら書けよ
969NAME IS NULL:2015/02/17(火) 21:41:50.68 ID:???
>>967
それはインデックス付きビューが実装されているRDBMS限定の話?それとも全般で?
970NAME IS NULL:2015/02/17(火) 21:49:59.55 ID:???
御託は良いから、他人のレスを批判する前に「俺ならこうする」を書けばいいだけだろ
971NAME IS NULL:2015/02/17(火) 21:57:22.24 ID:???
すごいな。まぁ俺は書いてるから対象外だな。
972NAME IS NULL:2015/02/17(火) 23:01:20.33 ID:???
ID出さずに俺は書いてる言ってもなw
973NAME IS NULL:2015/02/17(火) 23:19:24.98 ID:???
View6層ぐらい重ねても別に性能悪くならないよね?
アホなこという奴いて困る
974NAME IS NULL:2015/02/17(火) 23:25:12.03 ID:???
メンテナンスが大変そうだね
975NAME IS NULL:2015/02/17(火) 23:38:42.60 ID:???
>>952
もうね、あんたみたいなのは宇宙的バカwww
976NAME IS NULL:2015/02/17(火) 23:58:45.01 ID:???
>>972
否定された理由がわからないレスを挙げてくれ
977NAME IS NULL:2015/02/18(水) 00:00:36.21 ID:???
>>954
板違い
978NAME IS NULL
ビュー使えや
⇒ 性能ガー
今時は六層ぐらいでも大丈夫
>>974 メンテナンスが大変そうだね

そりゃその頭なら、大変だと思うよ w