ChatGPTに長年の悩みであるデータベースについて質疑応答を繰り返し、
ある程度 ベースとなる知識をみにつけることができました。
今回はその過程をご紹介します。
みなさんがChatGPTを活用される際の参考にしてみてください。
私、データベースに憧れておりまして。
漠然としていますが、自分でデータベースを作って運用したいなぁと思っています。
で、亀の歩みではありますが少しずつ理解を進めてきました。
「データベースなんて所詮テーブルの集合体なんですよ」
という以前ご一緒した派遣社員の方のセリフが印象的でした。
そして昨年、部内申請サービスの開発に携わることにより、かなり自分の中で肌感を持ってデータベースを感じることができるようになってきました。
テーブル同士の紐づけがわかってきたというか。
それでもわからないことがありました。
それは、フィールドの数がいくつになるか分からないテーブルの作り方です。
例えば、人のデータベースがあったとします。
名字や名前は、1つだけですよね。だからフィールドも1つ用意しておけば良い。
ところがニックネームはどうでしょうか?
ニックネームが無い人もいますし、5つくらい持っている人もいます。
このようなデータをどうやって登録したり管理したら良いのかが、わからないのです。
Webのフォームではよく、「+」ボタンを押すことにより入力フィールドが追加されるようなUI(ユーザーインターフェイス)が用意されていたりしますよね。
あれに、猛烈に憧れるわけです。
ちなみに自社で作ったサービスはこのような場合、想定される最大数、フィールドを予め用意していました。
ニックネームの例だと、10個あればまぁ足りるっしょ、的な感じです。
カッコ悪いですよね。
で、今回この悩みをChatGPTにぶつけてみることにしました。
以下がその履歴です。

こんなあいまいな文章でこちらの意図を汲み取るのに驚きました。
しかもJavaScriptでのソース付きです。

これに対する答えがこれ。
入力欄を追加するUIによってデータベースの構造は異なる場合があります。以下にいくつかの一般的なアプローチを示しますが、実際のデータベースの設計は、ウェブアプリケーションの要件やデータの性質によって異なります。
1. 単一のテーブル:すべての入力欄の値を1つのテーブルに格納する方法です。各入力欄はテーブルのカラムに対応し、追加された入力欄は新しいカラムとしてテーブルに追加されます。このアプローチでは、テーブルの構造を事前に定義する必要がありますが、柔軟性に欠ける場合があります。
2. 関連するテーブル:入力欄ごとに新しい行を持つテーブルを作成する方法です。たとえば、メインのエンティティ(例:フォーム)を表すテーブルと、各入力欄の値を格納するテーブルを作成します。メインテーブルと入力欄テーブルの間に関連性を設定し、各入力欄の値を関連付けます。この方法では、柔軟性が高まりますが、複雑さも増します。
3. キー-バリューストア:NoSQLデータベースを使用して、動的に追加される入力欄とその値をキーとバリューのペアとして格納する方法です。各入力欄は一意のキーを持ち、値はそのキーに関連付けられます。このアプローチはスキーマレスで柔軟性がありますが、特定のデータベーステクノロジーに依存します。
これらのアプローチは一般的な例ですが、実際のデータベース設計はプロジェクトの要件やデータの性質に基づいて行われます。ウェブ開発の専門家が特定のプロジェクトに合わせて最適なデータベース構造を設計することをおすすめします。
正直よく分からなかったので、先に紹介したニックネームを例に質問してみました。

ニックネームの数がゼロから複数まで可変する場合、以下のようなアプローチを考慮できます。
1. 単一のテーブルの可変カラム: ユーザーテーブルに可変のニックネームカラムを追加します。このカラムは、複数のニックネームを格納するために配列やJSON形式でデータを保持できます。ニックネームがない場合、カラムにはデフォルト値(例: NULL)を設定できます。このアプローチはシンプルで柔軟性がありますが、データベースの操作やクエリがやや複雑になる場合があります。
2. 関連テーブル: ユーザーテーブルとニックネームテーブルの2つのテーブルを作成します。ユーザーテーブルはユーザー情報を格納し、ニックネームテーブルはユーザーIDとニックネームの関連性を持つ複数の行を持ちます。ユーザーに関連するニックネームがない場合、ニックネームテーブルに対応する行は存在しません。この方法は正規化されており、データベースの操作やクエリが比較的容易ですが、データの一貫性を維持するために追加の管理が必要です。
どちらのアプローチが最適かは、具体的な要件やデータの特性に依存します。後に新たな要件が追加される可能性がある場合や、ニックネームに関連する情報(例: 作成日時、更新履歴)を追跡する必要がある場合は、関連テーブルのアプローチがより柔軟で拡張性が高いかもしれません。
データベース設計はプロジェクトの要件と目標に基づいて行われるべきですので、ウェブ開発の専門家に相談することをおすすめします。
文字多すぎて分からなかったので下記の質問をしました。

答えがこちら。
もちろんです!可変のニックネームカラムは、データベースのテーブルにおいて、複数のニックネームを格納するための特別な場所と考えることができます。
通常、データベースのテーブルは、特定の情報(例えば、ユーザーの名前やメールアドレス)を1つのカラムに保存します。しかし、可変のニックネームカラムでは、複数のニックネームを保持することができます。
具体的な例を挙げましょう。仮に「ユーザー」というテーブルがあり、そのテーブルに「ニックネーム」というカラムを追加したい場合を考えます。
1. シンプルな場合:
「ユーザー」テーブルの「ニックネーム」カラムは、複数のニックネームを配列(リスト)やJSON(データの形式)として保持します。たとえば、ユーザーAは["ニックネーム1", "ニックネーム2"]という複数のニックネームを持つことができます。2. 複雑な場合:
「ユーザー」テーブルに別の「ニックネーム」テーブルを作成し、ユーザーとニックネームを関連付けます。この場合、各ニックネームは個別の行としてテーブルに格納されます。ユーザーAは複数のニックネームを持つことができ、それぞれのニックネームは「ユーザー」テーブルと「ニックネーム」テーブルの関連を使用して関連付けられます。つまり、可変のニックネームカラムは、1つの場所に複数のニックネームを格納する方法です。これにより、ユーザーがゼロから複数のニックネームを持つ場合に対応できます。
ただし、可変のニックネームカラムを使用する際には、データベース操作やクエリの処理がやや複雑になる可能性があることを理解しておいてください。
「シンプルな場合」については理解できました。
要はカラムは1つなんです。
で、中に「["しょこたん", "しょうこさん"]」みたいな感じで、ニックネームをいくつでも入力することができる。
ただこのやり方は、ChatGPTさんも言われている通り、処理がダルそう。
なので、「複雑な場合」についてもう少し聞いてみました。

回答がこちら。
了解しました。複雑な場合のテーブルの関連付けについて、詳しく説明いたします。
複雑な関連付けを行う場合、通常は外部キーと呼ばれるメカニズムを使用します。外部キーは、1つのテーブルのカラムが別のテーブルの主キーと関連付けられることを意味します。これにより、テーブル間で関連性を確立することができます。
例を挙げて説明しましょう。前提として、「ユーザー」テーブルと「ニックネーム」テーブルがあるとします。以下に具体的な手順を示します。
1. ユーザーテーブルの作成:
ユーザーテーブルを作成し、それぞれのユーザーに一意のID(主キー)を割り当てます。このIDは他のテーブルとの関連付けに使用されます。```sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255)
);
```2. ニックネームテーブルの作成:
ニックネームテーブルを作成し、ユーザーIDとニックネームの関連性を表現する外部キーを追加します。```sql
CREATE TABLE nicknames (
id INT PRIMARY KEY,
user_id INT,
nickname VARCHAR(255),
FOREIGN KEY (user_id) REFERENCES users(id)
);
```3. テーブル間の関連付け:
ニックネームテーブルのuser_idカラムは、ユーザーテーブルのidカラムを参照する外部キーとして設定されます。これにより、各ニックネームが特定のユーザーに関連付けられます。これにより、ユーザーとニックネームの関連が確立されます。ニックネームテーブルのuser_idカラムは、ユーザーテーブルのidカラムと一致する値のみを受け入れるように制約されます。
このような関連付けを使用することで、ユーザーごとに複数のニックネームを持つことができます。また、クエリを使用してユーザーとその関連するニックネームを取得することも可能です。
なお、データベースの具体的な操作や構文は、使用しているデータベースシステムに依存します。上記の例は一般的な関連付けの概念を示したものであり、実際のデータベースシステムに応じて微調整する必要があります。
もし具体的なデータベースシステム(例: MySQL、PostgreSQL)を使用している場合は、そのデータベースのドキュメントやリファレンスを参照することをおすすめします。
これでだいぶイメージが湧きました。
「中川翔子」というレコードに対して、その一意なIDを持ったニックネームテーブルを作成するってことなんですよね。
最後に、今回聞いたような内容を検索するにはどんなキーワードを使えば良いのかを聞いてみました。
答えはこちら。
データベースの設計や関連付けに関する情報を検索する際には、以下のようなキーワードを使用すると良いでしょう:
- データベースの設計方法
- データベースのリレーションシップ(関連付け)の設計
- データベースの正規化
- データベースの外部キーと参照制約
- 可変カラムのデータベース設計
- データベースのマルチバリューカラムまた、具体的なデータベースシステムを使用している場合は、そのシステムの名前をキーワードに追加することで、より具体的な情報を見つけることができます。例えば、「MySQLデータベースの可変カラム設計方法」などと検索すると、MySQLにおける可変カラムの設計に関する情報を見つけることができます。
これらのキーワードを使って検索を行うと、データベースの設計や関連付けに関するさまざまな情報やガイドが見つかるでしょう。
「可変カラムのデータベース設計」が良さそうです。
次はこのキーワードで探してみることにしたいと思います。
何度でも繰り返し質問しても嫌な顔されない!(o(*゚▽゚*)o)
当たり前なのですが、ChatGPTは何度質問しても嫌な顔されません。
「中学生でもわかるように教えてください」
という、普通の人に言ったらしばかれそうな質問にも
「もちろんです!」
と快く答えてくれます。
意欲のある人や、ベースのスキルのある人がどんどん加速していく
今回の私のように、意欲のある人はこんな感じでどんどんChatGPTと質疑応答を繰り返してスキルを上げていくんだろうなと思います。
あと、ベースのスキルがある人は、自身の不足している部分をどんどん補完していくんだろうなと思います。
そうなると、ますますできる人とできない人の格差ってのが広がっていくんだろうなと予想します。
私もChatGPTでブーストされる側の人になりたいので、今後もこんな感じで活用していきたいと思いますし、その過程もこのブログで紹介できればと思います。
ここまで読んでいただきありがとうございました。
最後まで読んで頂いたお礼に、今後のAI動向について私が情報収集に役立つなぁと思っているVoicyラジオをご紹介したいと思います。
たいろーさんです。
毎日10分以下で、日々進化を続けるAI業界についてサクッと解説してくれています。
本当に助かってます。