• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列ようなデータ構造はSQLで作成できますか?)

配列ようなデータ構造をSQLで管理する方法

このQ&Aのポイント
  • 配列ようなデータ構造をSQL(特にMySQL)で管理することは可能です。
  • おすすめの方法としては、データベース内に別のテーブルを作成し、ユーザ情報とfollower_idsを一対多の関係で結び付ける方法があります。
  • XMLやJSON形式も使用することができますが、データ操作の速さを考えると、SQLでの管理が効率的です。

質問者が選んだベストアンサー

  • ベストアンサー
  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.3

0   TARO (ID 2, 3をフォロー) 1   HANAKO (ID 3をフォロー) 2   JACK (ID 0をフォロー) 3   TOM (誰もフォローしていない) でしたら id(主キー),name 0   TARO 1   HANAKO 2   JACK 3   TOM と id , follower_ids(idとfollower_idsの複合で主キー) 0 2 2 0 3 0 3 1 ですね。前者のテーブルはidの数だけレコード。 後者のテーブルはフォロワーの延べ数だけあればよいかと。 主キーは数字でなくて文字でもユニーク(一意)であればOKです。

newtgecko
質問者

お礼

なるほど、理解しました。 id, nameで管理するテーブルはどのようなデータ構造を取ればいいかはわかっていましたが、id, follower_idsのデータ構造は分かりませんでした。 2人フォロワーがいるときは、 3 0 3 1 のように重複させて1対1で保管するんですね。どうしてもそういう風にデータを捉えることができませんでした。 <users>  <user id='0'>   <name>Taro</name>   <followers>    <id>2</id>    <id>3</id>   </followers>  </user>  <user>  ....  </user> .... </users> XML風に書くと上記のような感じのデータ構造を感じしか頭にでてきませんでした。 MySQLの概要を把握するために、ドットインストール(http://dotinstall.com/lessons/basic_mysql_v2) でSQLの文の書き方は見たので、SELECT文がかなり強力なのは見ました。複合で主キーにすることもできるんですね。 フォロワーのリストの2つの対のデータは、重複しない組み合わせになって、主キーにしておけば検索が早く済むというわけですね。 最後までありがとうございました。

その他の回答 (3)

回答No.4

標準のSQLには配列に対する配慮がほとんどなく、テーブル構造には配列のような繰り返しは持たない方法が一般的です。繰り返しの代わりに必要な分の行を登録します。なので「ID」と「名前」のテーブルを1人に1行と「ID」「フォロアー」のテーブルで繰り返しの分だけ行を登録します。

newtgecko
質問者

お礼

ご回答ありがとうございます。 本当に申し訳ありません。こちらが、他の回答者さんのお礼を書いている間にご回答されたようです。 これから、またお世話になる機会があるかもしれないので、その時はよろしくお願いします

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 先に、質問の答えだけ挙げておきますね。    USER_LIST   user_id    (pk)   name  FOLLOWER_LIST   user_id    (pk)   follower_id  (pk)  の二つのテーブルで、データベースを構築します。ここで、pkが振ってあるのは、プライマリーキーです。  これだけの情報で、ユーザーとフォロワーに関する質問には、大抵答えられます。  sqlを横に置いておいて、手で、探してみましょう。  followerの名前も、userの名前も、ちゃんとuser_listにあります。followerだって、ユーザーの一員ですから、あるfollower_idがあった時、名前を調べるには、USER_LISTのuser_idで引けば良いですよね。  あるユーザーがだれをフォローしているかは、FOOLLOWER_LISTのuser_idを見て、該当するユーザーの全ての行のfollower_idを拾ってくればOKです。follower_idの名前が知りたければ、USER_LISTに戻って、名前を調べれば良いです。  逆も出来ます。ある人にフォローされている人は誰ですか?今度は、FOLLOWER_LISTの該当するfollower_idの行を全部とってきて、user_idをリストにすればよいです。名前が知りたければ、USER_LISTに戻れば調べられます。    SQLで、データを検索するために使用する、SELECT文は、このような複数から行う表引きを簡単にできるように設計されています。  もっと複雑な質問でも、ちゃんと書けば大概の質問には答えられます。    実は、リレーショナルデータベース(MySQLもこの一員です。)を操作するのに、必須の命令は、たったの7つしかありません。  SELECT  INSERT  UPDATE  DELETE  CREATE TABLE  ALTER TABLE  DROP TABLE  最初の4つは、データを操作するための命令。後の3つは、テーブルを作ったり修正するための命令です。リファレンスを見ると他にも山のように命令語がありますが、全部、データベースそのものの管理・保守用の命令です。  このたった7つの命令を解説すると、本が一冊出来上がります。  上級向けの本では、SELECT命令だけを解説するのに、一冊の本があるくらいです。(極端な事例では、ツリー構造をselect文でどう扱うか?だけをテーマにした書籍も知っています。)    当然、その背景には、数多くの概念があるわけですが、残念なことに、これを説明するには、この解答枠はあまりにも狭すぎます。  ぜひ、MySQLの入門書(書店に行けば、そのものずばりの入門書が多数あります。)を一冊購入されて学習されることを強くお勧めします。  一番それが早道でしょう。  普通、ソフトの使い方は、「ヘルプを読め」とか「ググレ」の一言で全てを片付けることも出来るんですが、このリレーショナルデータベースシステムは、それが出来ない数少ないソフトの一つです。  基礎の概念を最初から順を追ってやっておかないと、理解できないんですね。こういう時には、マニュアルとか、web検索という代物はすっごく不便ですから。

newtgecko
質問者

お礼

ご回答ありがとうございます どのように検索すればいいか頭で考えさせるくれる文もあって親切にありがとうございます。 プログラミングをやってきてもクライアントサイドとサーバーサイドはかなり違う感じがします。サーバーサイドのほうがどうしても敷居が高いです。mitonekoのアドバイスを聞いてSQLに関する書籍を読んでみたいと思いました。

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.1

DBにデータを格納するうえで正規化は外せません。 正規化するということは繰り返し項目をなくすことです。 ですから、 id , name というテーブルのレコードはユーザーの数だけあり、 id , follower_ids というテーブルのレコードはユーザーあたりフォロワーの数だけレコードが存在します。 これらを結合して読み出せばよいかと。

newtgecko
質問者

お礼

シンプルなご回答ありがとうございます。 申し訳ないですが、SQLを使ったことがないので、どのようにすればよいか想像がつきません。 例えば、以下のユーザーがいた時はどういうデータ構造を取ればよいのでしょうか? ID   NAME 0   TARO (ID 2, 3をフォロー) 1   HANAKO (ID 3をフォロー) 2   JACK (ID 0をフォロー) 3   TOM (誰もフォローしていない) できれば、IDは数値ではなく文字列でも大丈夫な方法をお願いします

関連するQ&A