質問するログイン新規登録

回答編集履歴

3

サンプルデータ追記

2017/07/28 12:40

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -21,16 +21,27 @@
21
21
 
22
22
  たとえば今回のテーブルが将棋を扱うものであれば(すいません、知識がないです)、各手を記録するために手ごとに盤面の状態(すべての駒の絶対位置)を記録するのか、生じた事実(どこの位置に何の駒を置いた/取った)を記録するのか、もしくは両方やるのか…によってその後のデータベース設計や、プログラムの作り方が大きく左右されますよね。
23
23
 
24
- 次に必要なデータを正規化によって各テーブルに分割していきます。たとえば「2017/7/28、渋谷将棋会館で行われた、鈴木氏と佐々木氏の対戦:虎王戦決勝トーナメント1回戦で、1手目、先手の鈴木氏は、7六歩」という情報を記録したいとすると、対戦の情報と手の情報でテーブルを分けられそうです。
24
+ 次に必要なデータを正規化によって各テーブルに分割していきます。たとえば「2017/7/28、渋谷将棋会館で行われた、鈴木氏と佐々木氏の対戦:虎王戦決勝トーナメント1回戦で、1手目、先手の鈴木氏は、7六歩」という情報を記録したいとすると、とりあえず対戦の情報と手の情報でテーブルを分けるのがよさそうです。
25
25
 
26
26
  | gameid | date | location | player-black | player-white | game-name |
27
27
  |:-------|:-----------|:------------|:-------------|:-------------|:----------|
28
28
  | 1234 | 2017-07-28 | 渋谷将棋会館 | 鈴木 | 佐々木 | 虎王戦決勝トーナメント1回戦 |
29
29
 
30
- | gameid | moveid | player | x | y | piece | action |
30
+ | gameid | moveid | x | y | piece-player | piece-type |
31
- |:-------|:-------|:-------|:--|:--|:------|:-------|
31
+ |:-------|:-------|:--|:--|:-------------|:-----------|
32
+ | 1234 | 1 | 1 | 1 | white | 香車 |
33
+ | 1234 | 1 | 1 | 3 | white | 歩兵 |
32
- | 1234 | 1 | black | 7 | 6 | 歩 | 置く |
34
+ | 1234 | 1 | 1 | 7 | black | 歩|
35
+ | 1234 | 1 | 1 | 9 | black | 香車 |
36
+ | ... | ... | . | . | ... | ... |
37
+ | 1234 | 1 | 9 | 9 | black | 香車 |
33
38
 
34
- という感じになります。さらに開発が進むと「田中氏と田村氏の対戦検索するとき、先攻:田中/後攻:田村 と 先攻:田村/後攻:田中 と2回検索するのが大変だな…」と感じ、じゃあそこを抜き出して別テブルにするか…と改善を進めていく感じです(これも正規化の一種です)
39
+ という感じになります。記録するパタンなら次のようなりま
35
40
 
41
+ | gameid | moveid | player | x-before | y-before | x-after | y-after | piece | action | narite |
42
+ |:-------|:-------|:-------|:--|:--|:--|:--|:------|:-------|:--------|
43
+ | 1234 | 1 | black | 7 | 7 | 7 | 6 | 歩兵 | 移動 | no |
44
+
45
+ さらに開発が進むと「田中氏と田村氏の対戦を検索するとき、先攻:田中/後攻:田村 と 先攻:田村/後攻:田中 と2回検索するのが大変だな…」と感じ、じゃあそこを抜き出して別テーブルにするか…と改善を進めていく感じです。(これも正規化の一種です)
46
+
36
47
  がんばってくださいね。

2

データベース設計について追記

2017/07/28 12:39

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -11,6 +11,10 @@
11
11
 
12
12
  うすうす感じているとは思いますが、これだけ莫大なカラムが必要になるということは**データベースの設計に問題がある**ことを意味します。データベースの不備は後々辛い思いをすることになるので、無理のない設計を心がけたいところです。
13
13
 
14
+ ---
15
+
16
+ (追記)
17
+
14
18
  データベースの設計はシステム設計・開発とは別に専門家(DBA: Data Base Administrator)が存在するほど難しく奥深い世界です。「達人に学ぶDB設計 徹底指南書」などの技術本もありますが、最終的には経験や勘が重要になってきます。
15
19
 
16
20
  まずはQiitaなどで関連するエントリーを読んで基礎知識を軽くおさえておきましょう。「**正規化**」がキーワードです。そのあとはソフトを作ってみて「あー、こうなってると検索がめんどくさいなー。結果を表示させるときにデータの加工が大変だな。なんかSQL実行が遅いな…」などと感じてきたら、テーブルやカラム(スキーマ)の設計を見直す、といった作業を繰り返していくしかないと思います。
@@ -23,9 +27,10 @@
23
27
  |:-------|:-----------|:------------|:-------------|:-------------|:----------|
24
28
  | 1234 | 2017-07-28 | 渋谷将棋会館 | 鈴木 | 佐々木 | 虎王戦決勝トーナメント1回戦 |
25
29
 
26
-
27
30
  | gameid | moveid | player | x | y | piece | action |
28
31
  |:-------|:-------|:-------|:--|:--|:------|:-------|
29
32
  | 1234 | 1 | black | 7 | 6 | 歩 | 置く |
30
33
 
34
+ という感じになります。さらに開発が進むと「田中氏と田村氏の対戦を検索するとき、先攻:田中/後攻:田村 と 先攻:田村/後攻:田中 と2回検索するのが大変だな…」と感じ、じゃあそこを抜き出して別テーブルにするか…と改善を進めていく感じです。(これも正規化の一種です)
31
35
 
36
+ がんばってくださいね。

1

DB設計につい

2017/07/28 12:25

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -9,4 +9,23 @@
9
9
 
10
10
  ---
11
11
 
12
- うすうす感じているとは思いますが、これだけ莫大なカラムが必要になるということは**データベースの設計に問題がある**ことを意味します。データベースの不備は後々辛い思いをすることになるので、いまうちにきちんと勉強し設計を見直すこをおすめします
12
+ うすうす感じているとは思いますが、これだけ莫大なカラムが必要になるということは**データベースの設計に問題がある**ことを意味します。データベースの不備は後々辛い思いをすることになるので、無理ない設計を心がけたいころです。
13
+
14
+ データベースの設計はシステム設計・開発とは別に専門家(DBA: Data Base Administrator)が存在するほど難しく奥深い世界です。「達人に学ぶDB設計 徹底指南書」などの技術本もありますが、最終的には経験や勘が重要になってきます。
15
+
16
+ まずはQiitaなどで関連するエントリーを読んで基礎知識を軽くおさえておきましょう。「**正規化**」がキーワードです。そのあとはソフトを作ってみて「あー、こうなってると検索がめんどくさいなー。結果を表示させるときにデータの加工が大変だな。なんかSQL実行が遅いな…」などと感じてきたら、テーブルやカラム(スキーマ)の設計を見直す、といった作業を繰り返していくしかないと思います。
17
+
18
+ たとえば今回のテーブルが将棋を扱うものであれば(すいません、知識がないです)、各手を記録するために手ごとに盤面の状態(すべての駒の絶対位置)を記録するのか、生じた事実(どこの位置に何の駒を置いた/取った)を記録するのか、もしくは両方やるのか…によってその後のデータベース設計や、プログラムの作り方が大きく左右されますよね。
19
+
20
+ 次に必要なデータを正規化によって各テーブルに分割していきます。たとえば「2017/7/28、渋谷将棋会館で行われた、鈴木氏と佐々木氏の対戦:虎王戦決勝トーナメント1回戦で、1手目、先手の鈴木氏は、7六歩」という情報を記録したいとすると、対戦の情報と手の情報でテーブルを分けられそうです。
21
+
22
+ | gameid | date | location | player-black | player-white | game-name |
23
+ |:-------|:-----------|:------------|:-------------|:-------------|:----------|
24
+ | 1234 | 2017-07-28 | 渋谷将棋会館 | 鈴木 | 佐々木 | 虎王戦決勝トーナメント1回戦 |
25
+
26
+
27
+ | gameid | moveid | player | x | y | piece | action |
28
+ |:-------|:-------|:-------|:--|:--|:------|:-------|
29
+ | 1234 | 1 | black | 7 | 6 | 歩 | 置く |
30
+
31
+