回答編集履歴
3
サンプルデータ追記
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 |
|
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 |
|
34
|
+
| 1234 | 1 | 1 | 7 | black | 歩兵 |
|
35
|
+
| 1234 | 1 | 1 | 9 | black | 香車 |
|
36
|
+
| ... | ... | . | . | ... | ... |
|
37
|
+
| 1234 | 1 | 9 | 9 | black | 香車 |
|
33
38
|
|
34
|
-
という感じになります。
|
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
データベース設計について追記
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設計につい
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
|
+
|