• ベストアンサー

データベースの設計について

朝からデータベースの設計について悩んでいます。 テーブルにしたいデータがあるのですが、 それぞれカテゴリーが違うデータがあります。 構造的には少ししか違わないのですが、 これらのデータを1つのテーブルとしてまとめるか、 それとも、それぞれ1つずつのテーブルにするか迷っています。 迷っている理由として: ・同時にアクセスがあった場合、全て一つのテーブルにまとめていると、障害がないか? ・全てを1つのテーブルにすると、多少は構造が違うので、必要のないフィールドが出てしまう。 それぞれを1つのテーブルで分割するということも考えたのですが、 例えば、全てのデータからある特定のデータの検索をかける場合に 不都合なのではないか?と考えてしまいます。 こういう場合には: select * from table_A where field="検索したいデータ"; select * from table_B where field="検索したいデータ"; select * from table_C where field="検索したいデータ"; とテーブルの分だけSQLを実行するしかないのでしょうか? どちらを選択しても、それぞれ一長一短のようで、混乱しています。 よろしくお願いします。

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

  • ベストアンサー
  • Te-Sho
  • ベストアンサー率52% (247/472)
回答No.1

候補としては4つぐらいあるでしょうか? 1)すべて別テーブル 2)1つのテーブルで固有項目を全て別の列で持つ 3)1つのテーブルで固有項目を固有項目1~として持ち、取り出してから加工 4)共通項目を1つの親レコードのテーブルとして持ち、固有項目を子レコードとして複数テーブル持つ。 おなじ意味合いの項目を検索すると言うことがあるようですから1)は無しですね。 ちょっとMySQLの仕様がわからないので微妙なんですが可変長な文字列(OracleでいうVARCHAR2など)データが格納されていないときに、あまり容量を取らない方であれば2)でもあまり問題ないかと思います。 3)の場合は容量は取りませんが固有項目に何が入っているか取り出したあとに型変換が必要になる可能性もあります。 私なら4)で共通の親テーブルと固有カラムごとの子テーブルを作ります。 共通の横断検索を行うときは親テーブルのみを検索するだけですし、データベースの拡張、固有項目や共通項目のカラム追加時のシステム影響度も少ないです。 システム構成の変更時もトラブルが少ないと思います。 ただし親と子を同時に更新する必要がある場合はトランザクション処理の考慮が必要です。

その他の回答 (1)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

あまり具体的ではないので、的確な回答はできませんが、 例えば、 テーブル1が ユーザーID|ユーザー名|データ1|データ2 で テーブル2が ユーザーID|ユーザー名|データ1|データ3|データ4 くらいの違いならば リレーションを考えて テーブル1 ユーザーID|ユーザー名 テーブル2 ユーザーID|データ1|データ2 テーブル3 ユーザーID|データ1|データ3|データ4 としたほうがすっきりするのではないかと思います。 取り出す場合は select * from テーブル1 left join テーブル2 on テーブル1.ユーザーID = テーブル2.ユーザーID; のようにすればいいかと思います。 (やり方によっては3つや4つのテーブルを結合させることもできます)

関連するQ&A