• 締切済み

2パターンのデータベース設計で最適なほうはどちら?

こんにちは。 データベース設計をするにあたり、迷っています。 言語はRuby on rails、DBはMysqlです。 たとえば日記サイトを作るとして (1)テーブル : users , diariesがあって、それぞれのidはuser_diaries というリレーション用のテーブルを作って持たせる (2)テーブル : users , diariesがあって、diaries にuser_id というカラムを持たせる というような作り方ができると思うのですが、どちらが優れていると言えるでしょうか? 決めの問題でしょうか? 将来的に大きなサイトになっても大丈夫なようにしておきたいです

  • MySQL
  • 回答数2
  • ありがとう数0

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

考え方次第ですね 通常SQLで管理するマスターデータや、定型でプールされていくような売上・ログなど と異なり、日記というと冗長で可変なデータになると思います。 MySQLの場合、char(varchar)系のデータと異なり、冗長なデータへの検索は あまり得意ではありません。たとえば前方後方一致「カラム LIKE '%hoge%'」的な 書き方はインデックスが効かずデータがたまってくると相応に重くなってきます。 英語圏では全文検索で解決できますが、日本語のように分かち書きがないものは 標準では検索対象としては適さないのが実情です。 つまり、たんにデータをだらだらと貯めていくだけならDBに乗せる必要はなく よくあるwikiのようにテキストデータでためておく方が管理しやすいということです。 MySQLではテキストデータのリレーション情報だけ管理することになります。 (SQLはあくまでも集計用だと割り切ってしまうということです) たとえば日記ID、テキストファイルの名称、ユーザーID、作成日、更新日、 削除フラグなどを取っておけば、別の人が「イイネ」をつけるとしても 日記IDだけ保持すればよいでしょう。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

Rails はさわったことないし、どうマッピングされるのかわからないから回答できないけど、 DB だけでいうと (1) 1ページの日記を、複数の人が共同で書く。 (2) 1ページの日記を、ひとりで書く。 かな?

関連するQ&A

  • 利用者数10万のデータベース設計について

    WEB上で利用者数10万のマイページ機能をもつようなビジネスサイトを構築しようと考えています。 ユーザーのID,PASS管理と ユーザーごとのマイページの中にスケジュール管理機能、顧客管理機能 を設けます。 このような大規模なデータベースの設計例を教えていただけないでしょうか? データベースにはMySQLを使用しようと考えています。 ユーザーのID管理は一つのテーブルじゃ無理ですよね? その場合どのように分ければいいのしょうか? ユーザーごとのマイページはユーザーごとにスケジュールテーブルなどを 作るべきなのでしょうか? MySQLの物理的最大DB,テーブル数の制限などあるのでしょうか? 私自身はデータベースプログラムが出来ないため設計の部分でお教えいただけたらと思います。

  • データベースの設計について教えてください。

    データベースの設計について教えてください。 基本的な質問ですみません。宜しくお願いいたします。 単純なテーブルで表現しますが、 パターンA、Bのどちらのテーブルで設計するのが良いのでしょうか。 DBはmysqlで5000万件のデータで検索のみのデータベースです。 【前提】 ユーザは複数のメールアドレスを持ちます。 画面から、このユーザのもつメールアドレスを表示させる仕様だとします。 【userマスタ】 (PK)ユーザID   ユーザ名   会社名 <パターンA> 【mailテーブル】 (PK)ユーザID (PK)ユーザメールアドレス   モバイル用アドレス <パターンB>  【mailテーブル】 (PK)ユーザメールアドレス   モバイル用アドレス   ユーザID ←インデックスをはります。

    • ベストアンサー
    • MySQL
  • Ruby on Railsで入力フォームを作成しています。

    Ruby on Railsで入力フォームを作成しています。 そこで、入力されたid(table.id)と商品名カラム(table.product_id) を結合して商品ID(table.product_number)を 登録時に商品IDカラムに登録できないかと思っています。 商品名カラムは商品テーブルから読み込んでいます。 恐らく、callbackのしくみを利用すればできるのではないかと 思っているのですが、やり方がわかりません。 以上、よろしくお願いします。 環境は以下のとおりです。 ruby1.8.6 rails 2.3.5 db:mysql gems:1.3.5

  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベーステーブル設計

    簡単なアプリケーションを作ろうとしています。内容は、レストランのデータベースです。画面には、単純にレストラン名、住所、電話番号、営業時間、評価を表示させたいです。この「評価」は、このアプリケーションを使用する3人のユーザが入力する1~5の値の平均値としたいです(ユーザはメンテナンス画面から1レストランにつき1回まで評価値入力可能)。つまりユーザAが4、ユーザBが5、ユーザCが1を入力した場合、4+5+1/3=3.3を表示します。テーブルを設計した経験がないので教えてほしいのですが、この場合、どのようなテーブルを作れば最もシンプルできれいに出来るのでしょうか。まずレストランテーブルを作成する必要があると思いますが、「評価」があるために1テーブルでは不足だと思います。評価カラムの値はユーザが値を入力すれば変動することになるので、別テーブルを参照させるようにすべきなのでしょうか?評価テーブルというものを考えてみましたが、ユーザ名とレストランIDの複合をプライマリキーとし、評価値カラムをもたせるとしても、どこに平均値を持たせればいいのかわかりません。テーブル設計の模範例を教えて頂けると助かります。宜しくお願いします。

  • railsでのデータベースエラー

    Ruby on rails を最近はじめました! MySQLをDBとしたところ、 Action Controllerでエラーが発生してしまいました! #28000Access denied for user 'root'@'localhost' (using password: NO) とはどういうことなのでしょうか?? アドバイスよろしくお願いします!! ※WindowsVista + MySQL + rails

  • Ruby on Rails によるデータベース作成

    Rubyもよくわからない初心者ですが、「かんたんRuby on RailsでWebアプリケーション開発」という本を見ながらデータベースを作成しています。Railsのバージョンは1.1.2、データベース管理はMySQLを使っています。 マイグレーションの作成まではうまく行っていると思うのですが、001_create_table.rbの修正、database.ymlの設定を行い、マイグレーション、scaffoldを実行してブラウザで表示すると、表示されないフィールドがあります。 001_create_table.rbでは次の部分を追加しています。 create_table(:items) do |table| table.column :index, :string, :limit => 32 table.column :pos, :string, :limit => 8 table.column :cid, :string, :limit => 32 table.column :type, :string, :limit => 5 table.column :flq, :integer table.column :ns, :string, :limit => 6 table.column :cflg, :integer table.column :wflg, :integer end 何回かやり直してみましたが、↑この中のtypeというフィールドがどうしても表示されません。 どこを直したらいいのか教えてください。 よろしくお願いします。

  • ruby on railsについてなのですが、scaffoldで入力フ

    ruby on railsについてなのですが、scaffoldで入力フォーム、一覧表示、詳細表示を作成しました。 そこで、一覧表示の際、テーブルのカラムに存在しない番号を一番左に表示させたいと考えています。3件存在すれば、上から1,2,3とういようにです。テーブルのIDを表示するとIDの1を削除した場合、2,3,4となってしまうので、3件あれば、必ず、1,2,3としたいのです。 環境は以下のとおりです。 ruby1.8.6 rails 2.3.5 db:mysql gems:1.3.5 よろしくお願いします。

  • 【MySQL】1対1でテーブルをあえて分ける

    mysqlを使用してデータベースを作成しているのですが データベースでテーブルを分けるときって 【アカウントテーブル】 ID アカウント 名 アカウント パスワード 名前 住所 電話番号 職業 【職業テーブル】 職業ID 職業名 というような1対多というのはよく組むとおもうんですが 下記のような 【アカウント情報テーブル(アカウント情報)】 アカウントID アカウント 名 アカウント パスワード 【アカウント情報テーブル(プロフィール情報)】 アカウントID 名前 住所 電話番号 職業 1対1の関係でテーブルをジャンル(エンティティ)ごとに複数にわけて あとでリレーションして一個にまとめるというのはデータベース的にあまりよろしくないのでしょうか? 何故、こんなことしたいかというと、1テーブルあたりのカラム数がかなり多くなってくると PHPでデータベースを書き込んだり呼び出したりする時に毎度多くのカラムを取り扱わなければならず SELECTで、カラムを一個一個選んで行かないといけません。 しかし、取り扱いたいカラムは大抵の場合あるジャンルだけなので リレーションするかしないかで、あるジャンルのデータだけを取り扱えれば 効率がよくなるのでは? というのがあります。 また、視覚的にカラムの把握もしやすくなります。 この1対1テーブルは、DB設計的にどうなでしょうか?

    • ベストアンサー
    • MySQL
  • 複数のデータベースを使う場合

    php4 + MYSQL4.0.2で作業しています。 1つのサーバーにある、複数のデータベースに接続する方法を教えてください。 DB1:テーブルhoge(ID、name) DB2:テーブルhogehoge(ID, hogeID, comment) このような場合、データベースが全てDB1に入っているとすれば、 $con = mysql_connect(host, user, pass); sql="SELECT name, comment" . " FROM hogehoge INNER JOIN hoge ON hogehoge.hogeID = hoge.ID"; $rst = mysql_db_query(DB1, $sql, $con); $col = mysql_fetch_array($rst); print($col['name'] . $col['comment']); となりますが、 テーブルhogeとhogehogeが、異なるデータベースに存在する場合はどのようにすればよいのでしょうか? 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL