mysql - 正确的数据库?需要改吗?

标签 mysql database database-design foreign-keys

我正在创建一个页面,我希望用户能够在该页面上为事件预订座位。


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

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

  • 成员表:
  • user_id int(8) Not null auto_increment
  • user_name varchar(30) 不为空
  • user_pass varchar(255) 不为空
  • 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-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;

我走在正确的轨道上吗?使用此设置,我能否开发出像样的最终产品?建议/改进?我不想在几周内重新开始,因为数据库结构质量很差。

最佳答案

首先,如果任何用户在任何给定时间只能持有一个席位,我不明白你为什么要使用第二张 table ,其次 user_idseats-table应与 user_id 大小相同在成员表中即 int(8) , 否则一段时间后你将无法让用户入座,第三个问题是 seat_status 的重复,我想这是一个错误或者你有另一个名字。 在我看来,如果它是 1->1 映射,则更好的想法是使用单个表并将其定义为

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;

关于mysql - 正确的数据库?需要改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12457629/

相关文章:

php - 将时间戳插入 MySQL 表中

java - 将数据库绑定(bind)到现有 JDBC 连接

sql - Oracle 服务器沙盒

database-design - 内容的 CMS 版本控制策略

sql - 这个 SQL 模式有什么问题?

java - 领域对象共享微服务

mysql - 如何将用户/帖子/设置从一个 vBulletin 安装移动到另一个安装?

MySQL。仅从一行中选择少量数据

database - 哪个数据库满足微小的数据需求

php - 根据输入调整函数中的sql语句