1

我正在创建一个页面,希望用户能够在其中预订活动座位。


  • 1 位用户只能预订 1 个座位
  • 用户登录时没有选择座位,首先购买了一个位置
  • 需要能够清除座位表,而不会丢失用户表中的任何内容(当然分配的座位除外。)

我创建了两个表,由于我对 mySQL 还很陌生,所以我想检查一下这是否正确完成:

  • 成员表:
  • user_id int(8) 非空 auto_increment
  • 用户名 varchar(30) 非空
  • user_pass varchar(255) 非空
  • 座位 ID smallint(6) 是 NULL

  • 座位表
  • seat_ID smallint(6) 无 auto_increment
  • user_id smallint(6) 是 NULL
  • 座位状态 tinyint(4) 是 NULL
  • 座位状态 tinyint(4) 是 NULL

我创建了 2 个 FK-refs:

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

首先,如果任何用户在任何给定时间只能持有一个座位,我不明白为什么您要使用第二张桌子,其次应该与成员表中user_id的大小相同,否则您将无法一段时间后有座位用户,第三个问题是座位状态的重复,我想这是一个错误,或者你有另一个名字。在我看来,一个更好的主意是如果它是 1->1 映射,则使用单个表并将其定义为seats-tableuser_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;

您必须使用所有可用的行和列填充座位数据库,插入时使用 null 以使用 auto_increment 功能!

检查是否有座位

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 回答