1

ユーザーがイベントの座席を予約できるようにするページを作成しています。


  • 1人のユーザーは1席しか予約できません
  • ユーザーは、最初にスポットを購入した後、ログイン時に座席が選択されていません
  • ユーザーテーブルから何も失うことなく、シートテーブルをクリアできる必要があります(もちろん、割り当てられたシートを除く)。

私は2つのテーブルを作成しましたが、mySQLはかなり新しいので、これが正しく行われたかどうかを確認したいと思いました。

  • メンバーテーブル:
  • user_id int(8)nullではないauto_increment
  • user_name varchar(30)null以外
  • user_pass varchar(255)nullではない
  • seat_ID smallint(6)はいNULL

  • 座席テーブル
  • seat_ID smallint(6)auto_incrementなし
  • user_id smallint(6)はいNULL
  • seat_status tinyint(4)はいNULL
  • seat_status tinyint(4)はいNULL

2つのFK参照を作成しました:

ALTER TABLE seats
ADD CONSTRAINT FK_seats  
FOREIGN KEY (user_id) REFERENCES members(user_id)  
ON UPDATE CASCADE  
ON DELETE CASCADE;

ALTER TABLE seats
ADD CONSTRAINT FK_seats  
FOREIGN KEY (seat_ID) REFERENCES members(seat_ID)  
ON UPDATE CASCADE  
ON DELETE CASCADE;

私は正しい方向に進んでいますか?この設定でまともな最終製品に進むことができますか?提案/改善?データベース構造の品質が低いため、数週間で最初からやり直したくありません。

4

2 に答える 2

2

まず第一に、ユーザーがいつでも 1 つのシートしか保持できない場合、2 番目のテーブルを使用する理由がわかりuser_idませんseats-table。3 番目の問題は、seat_status の重複です。間違いだったか、別の名前が付けられていたと思います。私の意見では、1->1 マッピングの場合は単一のテーブルを使用し、次のように定義することをお勧めします。user_idint(8)

CREATE TABLE `members-table` (
   user_id int(8) not null auto_increment,
   user_name varchar(30) not null,
   user_pass varchar(255) not null,
   seat -- your type choice, should be nullable if not seated
);

この構成で座席をクリアするのは、次のように簡単です。

UPDATE `members-table` SET `seat` = NULL;
于 2012-09-17T10:55:18.703 に答える
0
CREATE TABLE `seats` (
   id int(4) unsigned not null auto_increment primary key,
   row int(2) unsigned not null,
   col int(2) unsigned not null,
   UNIQUE(row, col)
) ENGINE InnoDB;

CREATE TABLE `members` (
   user_id int(8) not null auto_increment primary key,
   user_name varchar(30) not null,
   user_pass varchar(255) not null,
   seat int(4) unsigned null,
   FOREIGN KEY(seat) references seats(id) on delete set null on update restrict,
   UNIQUE(seat)
) ENGINE InnoDB;

利用可能なすべての行と列を座席データベースに入力する必要があります。auto_increment 機能を使用するには、挿入時に ID に null を使用してください。

席が空いているか確認する

SELECT COUNT(*) AS occupied FROM members WHERE seat = (SELECT id FROM seats WHERE row = :ROW AND col = :COL);

SELECT (1 - COUNT(*)) AS vacantより便利な場合は、上記のクエリで代わりに使用してください。

最初の空席を探す

SELECT MIN(id) FROM seats WHERE NOT EXISTS( SELECT seat FROM members WHERE seat = seats.id);

使用済みの座席をすべて割り当て解除

UPDATE members SET seat = NULL;
于 2012-09-17T12:55:47.793 に答える