• ベストアンサー
※ 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

  • 一つのフィールドに複数の情報を持たせたいです。

    データベースに詳しい方!一つのフィールドに複数の情報を持たせたいです。 例えば複数のユーザを管理するテーブルにあるID(フィールド)を 複数個をデータベースに保存する場合どうすればいいのでしょうか? 言語はJavaで、データベースはMySQLを使っています。 ↓↓各フィールド(例) -------------------------- || userName || userID || ○○ID || -------------------------- 上記の 「○○ID」というフィールド に複数の値を持たせたいのです。 String型の配列、もしくはXMLをMySQLの一つのフィールドに保存する 事はできるのでしょうか? (もし出来るのならこちらを採用したいです) それとも○○IDに関連するテーブルを作成する(?) それか最悪の場合、ユーザが増えるたびにテーブルを一つ作成 して管理するか・・・・(避けたいです) 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • ASPでSQL文を使う場合に。

    クラシックなASPを利用しております。 データベース(mdb)に、ユーザIDによってフィールドが分けられた部分があります。 そこをカウントさせたいです。その際のSQL文の書きかたがよくわかりません。 イメージとしては、以下のようなかんじです。      ユーザID:A ユーザID:B データID    1      1 データID    1      1 こんなかんじでデータベースに登録されていて、ユーザIDごとにデータが入力されている(1と入力されている)フィールドをカウントしたいのです。 ユーザIDは、ログインする際に取得されるもので、個人個人で変わります。Sessionを使用しています。 SQL文の中に引数という形でユーザIDが代入されれば解決するのですが、どうもうまくいきません。なんとか教えていただけないものでしょうか。

  • phpでのSQLでのデータの追加方法

    phpでのSQL実行に関して、下記のデータを追加するコードがあります。 mysql_query('INSERT INTO my_items SET maker_id=1, item_name="もも", price=210, keyword="缶詰,ピンク,甘い", sales=0, created="2010-08-01", modified="2010-08-01"') or die(mysql_error()); echo 'データを挿入しました'; 私は。それを INSERT INTO (フィールド名) VALUES(値) のSQL文で実行したいのですが、その方法が分かりません。 よろしければ、それを実行するコードを教えてください。お願いします。

    • ベストアンサー
    • PHP
  • MySQL→PHP→JSONをしたいのですが…

    現在、MySQLから取得したID一覧をJSON形式で出力したいのですが、うまくいきません。どうしたらよいでしょうか?よろしくお願いします。 なお、PHPでは以下のような処理をおこなっています。 ///////////////////////////////////////////////////////////////////// ・ ・ ・ //SQLを発行して結果セットを取得します $rst = mysql_query($sql); while ($col = mysql_fetch_array($rst)) { $return[] = $col; } function get_id($f) { return $f["dataid"]; } $return = array_map( "get_id", $return ); // JSON形式にして返す if( $return ) print Jsphon::encode( $return ); ・ ・ ・//////////////////////////////////////////////////////////////////// このようなかんじです。 この出力結果は『 ["18","19","20"] 』このようになるのでJSONでうまく処理できていないようです。 JSON形式なら『 {"dataid":"18","dataid":"19","dataid":"20"} 』 になるはずなのですが…何故でしょうか?教ええてください。お願いします。

    • ベストアンサー
    • PHP
  • SQLで取得したフィールドをSQL文として利用

    お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。

  • XAMPPでSQL文を流すとフリーズしてしまいます

    現在、PHPでホームページを開発中で、XAMPPで試行錯誤しています。 数回(5~10回程度) SQL文を流すとApach自体が落ちる?サーバに接続出来ない状態になってしまいます。 自分の予想だと、接続が解除出来ていず複数接続になってしまい落ちているのかと思っています。 XAMPPのバージョンは1.7.3です。 実際に作成したログイン画面のソースコードを貼ります。 よろしくお願いいたします。 $server = "localhost"; $id = "ID"; $pw = "パスワード"; $dbname = "dbname"; $conn = mysql_connect($server, $id, $pw ); if( $conn == false ) { die("MySQL 接続エラー"); } mysql_select_db( $dbname ); $sql = " SELECT * FROM user where user_id='".$_POST["user_name"]."'"; $res = mysql_query( $sql ); while( $row = mysql_fetch_array( $res ) ) { // ログイン画面から取得したPWとデータベースのパスワード(pass)を照合する if($cryptpass == $row["password"]){ $user = new User($row["user_id"], $row["mail"]); $_SESSION["user"] = serialize($user); } } mysql_free_result($resource); mysql_close();

    • ベストアンサー
    • PHP
  • SQL Injection対策はこれで十分?

    データベースにMySQLを使用しています。SQL Injection対策を行いたいのですが、以下の方法で十分防ぐことができるのでしょうか? <?php $hoge = $_GET['ok']; $sql = "select * from ok where user = '".mysql_real_escape_string($hoge)."';"; $res = mysql_query($sql ....... ?> よろしくお願いします。

    • ベストアンサー
    • PHP
  • FILE権限があるはずなのにSQLファイルを実行出来ない

    MySQL 3.23.58(Linux)です。 testというデータベースを作成し、ユーザtestuserにこのtestデータベースへのFILE権限やUPDATE権限など一通り持たせています。 ユーザ「testuser」でMySQLにログインし、use test;とすると、Database Changedと出てデータベースの編集が可能になるのですが、 mysql -u testuser -p ***** test < backup.sql この様にbackup.sqlというSQLファイルを実行しようとすると、ERROR 1044のアクセス権限がありませんエラーが表示されてしまいます。 SQLファイルをtestデータベースに反映させるにはどうすればいいでしょうか?

  • SQL文のエラー

    現在、TwitterのAPIを使って特定の@を含むツイートをmySQLに保存しようとしています。 そこで、 <?php mysql_connect("*********","*********","********")or die(mysql_error()); echo "データベースに接続しました"; mysql_select_db("********")or die(mysql_error()); echo "<br/>データーベースを選びました"; $feed=file_get_contents("http://search.twitter.com/search.atom?q=%40kenichiromogi"); //XMLパース $sxml=simplexml_load_string($feed); //パースしたものから、必要なものだけぶっこ抜く。 $i=0; while($i<=10){ $tabeta=$sxml->entry[$i]->content; $zikan=$sxml->entry[$i]->updated; $hito=$sxml->entry[$i]->author->name; //本文のUTF-8化 $utf8_tabeta=mb_convert_encoding($tabeta,"UTF-8","SJIS"); //参照文字化 $utf8_tabeta=mb_eregi_replace("\"",'"',$utf8_comment); // テーブルにレコード追加 mysql_query('INSERT INTO テーブル名 SET TIME="'.$zikan.'",NAME="'.$hito.'",COMMENT="'.$tabeta.'"') or die(mysql_error()); echo "データを挿入しました"; $i++; } ?> というプログラムを書いてみたのですが、 結果は データベースに接続しました データーベースを選びましたYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'http://twitter.com/kenichiromogi">kenichiromogi: でこ(3)子どもは' at line 1 というエラーが出てしまいます。 mySQLでは、以下のようなフィールドを作りました。 フィールド 種別 照合順序 属性 ヌル(NULL) デフォルト値 その他 操作 TIME    int(10)  UNSIGNED いいえ auto_increment NAME text utf8_general_ci いいえ COMMENT text utf8_general_ci いいえ どこが悪いのでしょうか? DBへの接続はできているので、おそらくSQL文がおかしいのだと思いますが、よくわかりません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • この配列のフォーマットの種類を教えてください

    こんにちは。 WordPressのSNSプラグインであるBuddyPressで作ったユーザー登録画面のカスタムチェックボックス型のプロフィール情報のデータベースを見ると下記のフォーマットで格納されています。 json形式かと思ったのですが、正しいフォーマットではないようです。 この配列が何の形式かご存じの方は教えてください。 値は仮のものです。また「s:」の後に付く数字は値に紐付くIDですのでここは任意の数字が入るとお考え下さい。 a:3:{ i:0; s:7:"aiueo"; i:1; s:21:"kakikukeko"; i:2; s:11:"sasisuseso"; } 宜しくお願いいたします。