• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テーブルのカラム構成について)

テーブルのカラム構成について

このQ&Aのポイント
  • テーブルのカラム構成についてご相談です。不特定多数のユーザーが利用するアプリで、ユーザーごとのお気に入りアイテムを記録するテーブルを作成したいと考えています。
  • テーブルにはプライマリとなるカラムが存在しないため、正常な設計なのか疑問です。また、使用するストレージエンジンの選択についても悩んでいます。
  • ご教授いただきたいです。

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

MySQLでは、複合カラムindex をprimary keyとすることができます。 primary keyは、unique index のひとつであり、行を特定するのに必要十分なものとして定義します。 user_noとfavorite_item でその行が特定されるなら、この2つのカラムによる複合indexをprimary keyとしてもよいと思います。 ただ、行特定のために必ず2つのカラム値を指定しなければならないので、他のカラム情報や他のtable との連携の都合によっては、もう一つカラムを加えて、一カラムで特定できるようにすることもあります。 myisam と innodb 比較については、複数クライアントからの同時更新がどのくらい発生するのか、などによるのでは?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • usersテーブルの構成カラムについて

    MySQLバージョン4.1.16を使用しています。 このジャンルでお願いします。 よく全ての基本となるusersテーブル(IDとパスワードを入れるユーザの基本テーブル) があると思うのですが、それを構成するカラムはどのような感じにするのが良いのでしょうか? 自分は、 CREATE TABLE `users` ( `user_id` varchar(16), `password` varchar(255) default NULL, `col1` varchar(255) NOT NULL, `col2` varchar(255) NOT NULL, PRIMARY KEY (`user_id`), ) ENGINE=InnoDB; このように代替キー(連番)を使わずにuser_idを主キー(unique)にして構成します。 理由としては、uniqueな列があるなら、わざわざ連番を割り当てる必要もないし、 他のテーブルがuser_idを外部キーとして持った時に、その表の外部キーの列が 数字であるよりも見やすいかなと思ったからです。 ただ一般的に出まわっているPHPフレームワークなどのテーブル構成ではusersテーブルというか ほとんどのテーブルに連番を使っている例があります。 次のusersテーブルは、PHPフレームワークのCakePHPで使われるusersテーブルの構成の例で、 連番を使用しています。 CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) collate utf8_unicode_ci default NULL, `password` varchar(255) collate utf8_unicode_ci default NULL, `group_id` int(11) NOT NULL, `disabled` tinyint(1) NOT NULL, `created` datetime default NULL, `modified` datetime default NULL, PRIMARY KEY (`id`), KEY `group_id` (`group_id`), KEY `disabled` (`disabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 使用状況によって、どちらが良い悪いというのは変わるのでしょうけど 基本的にusersテーブルというのはどのような構成にすべきなのでしょうか? ちなみに自分は連番は○○_seqというカラム名にしてます(ただこれも 一般的には○○idを連番にしてるケースが多いので、どうすべきか迷っています・・・)

    • ベストアンサー
    • MySQL
  • MySQL(5.5)1テーブル内のカラム数制限

    首記、InnoDBであれば1000、MyISAMであれば4096という仕様かと思いますが、CREATE TABLEを実行するとカラム数1500くらいから #1117 Too many columns のエラーが出てしまい、カラム数の多いテーブル追加ができない状況です。 こちら、事象や考えられる原因、対処方法などご存じの方がいれば教示いただけますか。 またVARCHARの64K制限があるため多くのカラムはTEXTにしています。

    • ベストアンサー
    • MySQL
  • テーブルの内容とテーブルのカラムの件数

    以下のようなテーブルがあります。 そのテーブルの内容と、そのテーブルのあるカラムの件数を条件にして抽出したいのですが、どのように指定すればよろしいでしょうか? テーブルA id(int) AUTO_INCREMENT, user_id(varchar), price(int), date(datetime) 表示したい一覧 user_id | date | price A | 2014-03-10 10:00:00 | 2600 B | 2014-03-11 11:00:00 | 2720 A | 2014-03-13 12:00:00 | 2500 C | 2014-03-14 15:00:00 | 2860 B | 2014-03-18 13:00:00 | 2450 A | 2014-03-19 19:00:00 | 2550 ・・・ などのレコードがあった場合、 user_idが同じ場合のレコード数が2~5の場合等を抽出したいと思います。 うまく表現できませんが、このような場合の抽出の仕方をわかる方、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLのテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL
  • カラム名でseqとidではどちらがふさわしいのでしょうか?

    mysql5.1.33を使用しています。 例えば、ユーザ情報を格納するuserテーブルがあって ユーザが決める半角英数字からなるIDを格納するuser_idカラムがあるとします。 そしてAuto Incrementなカラムも付け足すと、 [user] seq INT(11) NOT NULL AUTO_INCREMENT, user_id varchar(16) PRIMARY KEY (seq) UNIQUE KEY user_id (user_id) この場合はseqカラムが主キーになるわけですが、 一般的にはカラム名はseqではなくてidですよね? なんで自分はseqにしたかというと、 user_idカラムのidには文字(半角英字)のIDを、 seqは連番を意味づけさせたいと思いました。 つまり seqがつくカラム名は連番で idがつくカラム名は文字列 と直感的に分かりやすくなるだろうと思ったからなのですが、 みなさんはこのケース(そもそもこのカラム構成が正しいかは分かりませんが・・)の場合は、 どのようなカラム名を付けますか?

  • MySQL insert文に関するエラーについて

    ○質問の主旨 MySQLのデータベースにテーブルを作ってinsert文で データを追加しようとするとシンタックスエラーが出ます。 SQL文が間違っているのかと思いGoogle検索や本で調べたりしましたが、 なぜ文法エラーが発生するのか分かりません。 エラーと対処方法をご存知の方がいらっしゃいましたらご教示願います。 ○質問の補足 // usersテーブル create table users ( id int not null auto_increment primary key, created datetime not null, modified datetime not null, username varchar(255), password varchar(40) ); desc users; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | | username | varchar(255) | YES | | NULL | | | password | varchar(40) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ insert into users (created, modified, username, password) values (now(), now(), 'test1', 'test1'), (now(), now(), 'test2', 'test2') ); ERROR 1064 (42000): 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 ')' at line 3

    • ベストアンサー
    • MySQL
  • コラムの値からコラム・テーブルを検索

    プライマリキーが様々なテーブルで別の名前で利用されていると、テーブル同士の関連の全てが把握できずに困っています。以前にコラム名からテーブルを検索する方法を質問したのですが、私が扱っているデータベースでは、プライマリキーがシステムの別の場所で少しだけ異なる名前で利用されていることが多いので、その方法では把握できない関連が出てきます。 具体的には、EMPLOYEES__KEYというEMPLOYEESテーブルのプライマリキーがPERSONALIZE_EMPOYEESというテーブルでPSNLZ_EMP__KEYという名前で使われている状況を考えていただきたいと思います。PSNLZ_EMP__KEYのコラムのレコードは全てEMPLOYEES__KEY内のデータからとられているとします。 以前にselect TABLE_NAME from USER_TAB_COLUMNS where COLUMN_NAME = 'EMPLOYEES__KEY' というSQLで特定のコラムを使っているテーブルを全てリストアップできると教えていただいたのですが、今回のケースでは、同じような内容のコラムなのですが名前が異なるため上記のSQLでは検索できないテーブルがある場合、それをどうやってとってきたらよいのかということです。 コラムの値にtaro, jiro, hanakoなどのようにテーブルまたはシステム内でユニークな値が指定されている場合、コラムの値を指定し、「その値が使われているコラム・テーブルを列挙せよ」というような命令を与えればよいのだということまでは分かりますが、どのようにSQLを書けば良いか教えてください。

  • SQL文でテーブル作成 Access2002

    MySQLで create table testm ( key1 char(008) primary key, data1 int8, data2 int8, data3 int8 ) type=InnoDB; という風なSQLでテーブルを作成したりしますが Accessでは無理なのでしょうか? よろしくお願いします。

  • データベース ー どういうテーブル構造にしますか?

    管理者テーブル table admin admin int, adm_name text 商品テーブル table items item_id int, item_name text, item_price int と2つのデータテーブルがあった場合に 、誰がいつどんな変更をしたかを記録を取りたい場合、あなたならどういうふうに作りますか? itemsテーブルにカラムを増やしますか? 別テーブルでログ用のテーブルを増やしますか?

  • 他テーブルの集計結果を別テーブルのカラムに格納

    新規テーブル作成時にあるカラムに別のテーブルの集計結果を入れることはできるのでしょうか? 例えば、商品を定義したテーブルの中に、その商品が合計いくつ売れているかを集計するカラムを設置し、常に発注テーブルからその商品の合計発注数を引っ張って来て格納するイメージです。 テーブル作成時のみ集計するではなく、常に参照し動きがあれば数値が自動で変わるようになる方法を探しています。 いちいちselectで集計しなくても始めからカラムに集計値が入っていれば楽だなぁと思い質問しました。 どなたかわかる方いらっしゃいましたらよろしくお願いします。 商品テーブル CREATE TABLE product ( product_no SERIAL NOT NULL, (商品id) product_name VARCHAR(200) NOT NULL, (商品名) product_price VARCHAR(20) NOT NULL, (料金) product_sum INTEGER, (合計発注数)←ここ PRIMARY KEY(product_no) ); 発注テーブル CREATE TABLE order ( order_no SERIAL NOT NULL, (発注id) product_no INTEGER NOT NULL REFERENCES product(product_no) ON UPDATE CASCADE ON DELETE CASCADE,(商品id) order_num INTEGER NOT NULL,(その商品の発注数) order_date TIMESTAMP,(発注日) PRIMARY KEY(order_no) );