C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[34]: c#アプリ、db設計について


(過去ログ 91 を表示中)

[トピック内 36 記事 (1 - 20 表示)]  << 0 | 1 >>

■54451 / inTopicNo.1)  c#アプリ、db設計について
  
□投稿者/ ぽん (40回)-(2010/10/21(Thu) 10:47:36)

分類:[データベース全般] 

お世話になります。現在麻雀の成績を管理するアプリ(Form)を作成しているのですが、
dbについての知識が乏しく現在勉中でして、db設計について質問したいと思います。

Vista、VisualC#、SqlServer2008ExpressEditionで開発を行っております。

現在以下のようなテーブル設計になっています。
No、日付、氏名、時間、対戦数、1位率、2位率、3位率、4位率、連対率、平均順位、平均チップ、ポイント、
チップ、収支、場代、総収支、時給換算

というような1つのテーブルになっています。

Noが主キーとなっており。アプリ側で氏名、月を選択するDropDownListがあり、
それを選択すると上記テーブル設計のデータがDataGridViewに表示されるような形式になっています。

後々のメンテナンスを考えると、dbをどのように正規化すればよいでしょうか?
後、主キーの設定についてNo以外でいい方法はないでしょうか?

よろしくお願いいたします。
引用返信 編集キー/
■54454 / inTopicNo.2)  Re[1]: c#アプリ、db設計について
□投稿者/ 囚人 (551回)-(2010/10/21(Thu) 12:49:07)
1位率などを人間が計算していれるのか、単に順位だけを毎回入力して1位率を計算するのかで変わってくるので何とも言えませんねぇ。
後者なら1位率なんていう列も不要になるわけですし。
引用返信 編集キー/
■54455 / inTopicNo.3)  Re[2]: c#アプリ、db設計について
□投稿者/ マサヤ (167回)-(2010/10/21(Thu) 13:11:44)
>No、日付、氏名、時間、対戦数、1位率、2位率、3位率、4位率、連対率、平均順位、平均チップ、ポイント、
>チップ、収支、場代、総収支、時給換算
これを一つのテーブルにしてるのがおかしいのではないでしょうか?

半荘か東風か、わかりませんが、一度終了した時点で逐一結果を登録するテーブルを用意すればいいように感じます。

>主キーの設定についてNo以外でいい方法はないでしょうか?
NoってIDみたいなものと考えていいのでしょうか?
同姓同名で時間が一緒という状況が考えられるので一意キーとしてIDは必要かと思います。

結果を登録するテーブルにはID、日付、氏名、時間、順位、チップ数、ポイント、収支 があればよいかと。

そして結果集計一時テーブルで対戦数、一位率・・・時給換算などを用意したらいいのではないでしょうか?




引用返信 編集キー/
■54457 / inTopicNo.4)  Re[3]: c#アプリ、db設計について
□投稿者/ ぽん (42回)-(2010/10/21(Thu) 13:52:18)
皆さまありがとうございます。

>1位率などを人間が計算していれるのか、単に順位だけを毎回入力して1位率を計算するのかで変わってくるので何とも言えませんねぇ。
後者なら1位率なんていう列も不要になるわけですし。

そうですよね^^;
これは後者なので不要になるんですね。。。

>結果を登録するテーブルにはID、日付、氏名、時間、順位、チップ数、ポイント、収支 があればよいかと。
>そして結果集計一時テーブルで対戦数、一位率・・・時給換算などを用意したらいいのではないでしょうか?

なるほど!そういう風に考えられますね。
こんなことも分からずすみません。

今現在複数人のデータが入っているため、私的にはこの他に名前テーブルを作った方がいいのかと思ったのですが、ご意見お聞かせ願えないでしょうか?


引用返信 編集キー/
■54459 / inTopicNo.5)  Re[4]: c#アプリ、db設計について
□投稿者/ ぽん (43回)-(2010/10/21(Thu) 14:20:29)
連レスすみません。

今現在ですと、フォームに日付、氏名、1位数、2位数、3位数、4位数、レート、ポイント、チップレート、チップ枚数、場代を入力するようになっており、そこから計算した結果をdbに登録していました。

それではなく、日付、氏名、1位数、2位数、3位数、4位数、レート、ポイント、チップレート、チップ枚数、場代等をテーブルに登録すればよかったんでしょうか?

あとはその結果を結果テーブルに登録してそのデータをひっぱり出すか、テーブルに登録せずに、計算をsqlで書き、ひっぱればよいという考え方であってますでしょうか?
引用返信 編集キー/
■54461 / inTopicNo.6)  Re[5]: c#アプリ、db設計について
□投稿者/ いしだ (234回)-(2010/10/21(Thu) 14:37:22)
私なら、
・ユーザー用テーブル(氏名等)
・ゲーム用テーブル(日時やレート、チップレート等)
・成績用テーブル(ユーザーID、ゲームID、順位やチップ枚数等)
の3つのテーブルを作成します。
対戦数や1位率、平均順位等、計算で出せるものはDBに登録しません。

引用返信 編集キー/
■54462 / inTopicNo.7)  Re[6]: c#アプリ、db設計について
□投稿者/ マサヤ (168回)-(2010/10/21(Thu) 14:49:05)
>今現在ですと、フォームに日付、氏名、1位数、2位数、3位数、4位数、レート、ポイント、チップレート、チップ枚数、場代を入力するようになっており、そこから計算した結果をdbに登録していました。
Noが消えている件について、少々質問があります。
この入力フォームでどうやって人の特定をするのでしょうか?
同姓同名は絶対ありえない、とのことでしたら問題ありませんが。

テーブル構成につきましては、いしださんに同意します。
このようにしておけば、月ごと年ごとの平均連対率などを表示することも後々に可能となるからです。

引用返信 編集キー/
■54463 / inTopicNo.8)  Re[7]: c#アプリ、db設計について
□投稿者/ PATIO (32回)-(2010/10/21(Thu) 14:58:53)
2010/10/21(Thu) 14:59:49 編集(投稿者)

せっかくデータベースを使っているのですから統計結果を保存するよりも
毎回の成績を登録して行って週間、月間、年間などいろいろな期間で集計できたり、
後で新しい集計方法を追加したり出来た方が嬉しくないですか?
逆に単なる統計結果を保存するだけの話にするのでしたらRDBを使うより
単純になCSVファイルに吐き出すだけでも十分な気がします。

そういう意味ではいしださんが書かれているようなテーブル構成になるのかなと思います。

テーブルの正規化等の話でしたら書籍やネット上に情報があると思いますので
そちらで勉強される事をお勧めします。
掲示板で一から説明するような話では無いと思いますので。

引用返信 編集キー/
■54465 / inTopicNo.9)  Re[8]: c#アプリ、db設計について
□投稿者/ ぽん (44回)-(2010/10/21(Thu) 15:08:43)
皆さまご意見ありがとうございます。

>Noが消えている件について、少々質問があります。
この入力フォームでどうやって人の特定をするのでしょうか?
同姓同名は絶対ありえない、とのことでしたら問題ありませんが。

これは完全に書き忘れです。申し訳ありません。

いしださんのテーブル構成を元に、もう一度考えてみたいと思います。
皆さま本当にありがとうございました。

他に何かアドバイス等あれば指摘の方よろしくお願いします。

引用返信 編集キー/
■54539 / inTopicNo.10)  Re[9]: c#アプリ、db設計について
□投稿者/ ぽん (45回)-(2010/10/25(Mon) 18:05:32)
皆様の意見を参考にテーブルを設計してみました。

・ユーザーテーブル(id, 氏名(PK = id))
・ゲーム用テーブル(gameid, 日付, レート, チップレート, 場代(PK = gameid))
・成績用テーブル(id, gameid, 1位数, 2位数, 3位数, 4位数, 飛び数, 1位ポイント計, 2位ポイント計, 3位ポイント計, 4位ポイント計, チップ数(PK = id, gameid))

という風にしてみたのですが、整合性が取れない、またこうした方がいい等のアドバイスを皆さんに指摘していただきたく思いますのでよろしくお願いします。
引用返信 編集キー/
■54548 / inTopicNo.11)  Re[10]: c#アプリ、db設計について
□投稿者/ マサヤ (169回)-(2010/10/26(Tue) 10:04:46)
絶対的に自分の成績を見たいのであればいいのではないでしょうか?
一日ごとしか成績はつけないのですよね?

相対的に(年齢層など)自分の成績を見たいのであればテーブルに年齢などの項目が増えたりしますね。

時間とか時給換算とかは気にしないようになったのでしょうか?

あとは、よくあるパターンですが、すべてのテーブルのカラムに登録日時と更新日時とかあるといいかも、です。

引用返信 編集キー/
■54549 / inTopicNo.12)  Re[11]: c#アプリ、db設計について
□投稿者/ ぽん (46回)-(2010/10/26(Tue) 10:55:38)
No54548 (マサヤ さん) に返信
> 絶対的に自分の成績を見たいのであればいいのではないでしょうか?
> 一日ごとしか成績はつけないのですよね?
>
> 相対的に(年齢層など)自分の成績を見たいのであればテーブルに年齢などの項目が増えたりしますね。
>
> 時間とか時給換算とかは気にしないようになったのでしょうか?
>
> あとは、よくあるパターンですが、すべてのテーブルのカラムに登録日時と更新日時とかあるといいかも、です。
>

ちなみに、現在は5、6人程度のスコアを管理しており、後々増えても対応出来るような形を目指しています。
年齢別とかも集計出来たら面白いですね〜。
ゲーム用テーブルに時間のカラム入れ忘れました。。。orz

ちなみに自分ではこれが第三正規形だと思っているのですが、
合っていますでしょうか?




引用返信 編集キー/
■54550 / inTopicNo.13)  Re[12]: c#アプリ、db設計について
□投稿者/ ぽん (47回)-(2010/10/26(Tue) 10:56:40)
連レスすみません。
更新、登録日時の案は頂きます♪
引用返信 編集キー/
■54551 / inTopicNo.14)  Re[13]: c#アプリ、db設計について
□投稿者/ マサヤ (170回)-(2010/10/26(Tue) 11:09:46)
正規化を行うのであれば、成績用テーブル(ユーザーID、ゲームID、順位やチップ枚数等)はゲームごとにしないといけないかな、と思います。

現在、一日分をまとめてる形になっていると思いますが、これですと更新異常が発生したときに分かりにくくなる可能性があります。
引用返信 編集キー/
■54554 / inTopicNo.15)  Re[14]: c#アプリ、db設計について
□投稿者/ ぽん (48回)-(2010/10/26(Tue) 11:55:55)
No54551 (マサヤ さん) に返信
> 正規化を行うのであれば、成績用テーブル(ユーザーID、ゲームID、順位やチップ枚数等)はゲームごとにしないといけないかな、と思います。
>
> 現在、一日分をまとめてる形になっていると思いますが、これですと更新異常が発生したときに分かりにくくなる可能性があります。

ゲームごとですか。。。
ちょっと考えてみます!

ちなみに、1日でもメンバーが変わる場合があるため、その時はまた同じ日付で違うメンバーとの成績を入力するようになっています。
引用返信 編集キー/
■54556 / inTopicNo.16)  Re[15]: c#アプリ、db設計について
□投稿者/ マサヤ (171回)-(2010/10/26(Tue) 12:03:04)
> ちなみに、1日でもメンバーが変わる場合があるため、その時はまた同じ日付で違うメンバーとの成績を入力するようになっています。
え?それはちょっと相対成績用になっているのでテーブルに格納するデータとしてはあんまり。。。
テーブルの値は基本的に絶対評価にして、処理の部分で相対評価にしたほうがいいです。

ゲーム用テーブルがありますよね?それとユーザ、成績(ゲームごと)を紐づければメンバーが変わっても何も問題ないようになります。
また、この方法で特定の対戦者との成績とかも表示できます。

引用返信 編集キー/
■54558 / inTopicNo.17)  Re[16]: c#アプリ、db設計について
□投稿者/ ぽん (50回)-(2010/10/26(Tue) 12:15:17)
No54556 (マサヤ さん) に返信
>>ちなみに、1日でもメンバーが変わる場合があるため、その時はまた同じ日付で違うメンバーとの成績を入力するようになっています。
> え?それはちょっと相対成績用になっているのでテーブルに格納するデータとしてはあんまり。。。
> テーブルの値は基本的に絶対評価にして、処理の部分で相対評価にしたほうがいいです。
>
> ゲーム用テーブルがありますよね?それとユーザ、成績(ゲームごと)を紐づければメンバーが変わっても何も問題ないようになります。
> また、この方法で特定の対戦者との成績とかも表示できます。

そうでしたか。。。
では54539のカラムに登録、更新日時、それとゲーム用テーブルに時間を加えたもので一度進めてみたいと思います!
本当にありがとうございます。
引用返信 編集キー/
■54559 / inTopicNo.18)  Re[17]: c#アプリ、db設計について
□投稿者/ ぽん (51回)-(2010/10/26(Tue) 13:18:34)
すみません。最後にもう一度質問なのですが、

成績用テーブルについて、game_idは一意ですが、user_idは一意ではないので、
主キーはgame_idだけでいい(もしくはいらない)と思ったのですが、
この考え方は間違っていますでしょうか?


引用返信 編集キー/
■54560 / inTopicNo.19)  Re[18]: c#アプリ、db設計について
□投稿者/ PATIO (36回)-(2010/10/26(Tue) 13:48:32)
No54559 (ぽん さん) に返信
> すみません。最後にもう一度質問なのですが、
>
> 成績用テーブルについて、game_idは一意ですが、user_idは一意ではないので、
> 主キーはgame_idだけでいい(もしくはいらない)と思ったのですが、
> この考え方は間違っていますでしょうか?

成績テーブルをどのような単位でレコードを作るかによるカナと。
game_idはどういう単位で付けるんですか?
例えばですが、途中でメンバーの入れ替えがないひとまとまりをゲームとして、
ゲーム毎に清算をするとします。
この場合、データの最小単位はそのゲーム内のあるプレイヤーの成績になります。
(具体的には点数になるのですかねぇ)
データの持ち方として、一つのゲームが日を跨いだ場合にどう扱うのかとか
そういうのもありますね。
例えばですが、一位数とかではなくて
ゲーム開始時にメンバーを選択しておいて、次の画面では各メンバーの点数とかチップの数とかを入れるとしましょうか。
成績テーブルには清算毎の点数とチップ数等が蓄積されていきますから
あるゲームでの各人の順位はすぐに出せます。
更にその日の順位集計もデータベースの操作で計算できます。

と言うように最も基礎になるデータを入れておくといかようにも料理ができます。
データ入力の時点で順位数に丸めてしまうとそれ以上のデータは得られないわけです。
まあ、そこまで細かいのは要らないという話なら今の方針でも良いかもしれません。

実際には要求仕様があってそれにあった粒度でデータを持つようにします。

引用返信 編集キー/
■54574 / inTopicNo.20)  Re[19]: c#アプリ、db設計について
 
□投稿者/ ぽん (52回)-(2010/10/26(Tue) 20:29:48)
そうですよね。。。

今までは開始した日時(例えば20日の夜10時にスタートしたとして翌朝5時に終わればその間の成績をまとめて集計していました)
ちなみに上記の場合ですと、日時は20日になります。もしその間にメンバーの変更があった場合は、変更があった開始日付を元にまた集計します。

ちょっと分かりにくいんですが、1つのメンバーで麻雀が終了したとき(清算が終わる時)を1つの単位としてデータを入力していました。
ですので、ポイントやチップ、各順位の回数を手動で計算してから、その値をフォームに登録⇒DBという風になっていました。

>この場合、データの最小単位はそのゲーム内のあるプレイヤーの成績になります。
(具体的には点数になるのですかねぇ)

今回は最小単位を各ゲーム毎(半荘単位)をgame_idにしたいと思っています。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -