mysql - 我应该使用用户 ID 和事件 ID 作为复合主键吗

标签 mysql database database-design

我正在为项目创建数据库。

阅读数据库设计时请记住,这不是我的强项。

我有一个事件表和一个用户表,每个用户可以创建任意数量的事件。我的问题是,设计这张 table 的最佳方式是什么。

目前的设计如下;

每个用户可能拥有非常多的事件,因此我认为 PK 作为 event_id 本身将允许实际应用程序中的记录数量不足 因此,DB 设计如下,其中 user_id 是 PK 的一部分;

event(**event_id**, **user_id**, event_name...etc)
user(**user_id**, first_name...etc)

但是,生成 event_id + user_id 作为事件的唯一标识符是相当具有挑战性的,似乎唯一的方法(至少使用 MySQL/innodb)是存储过程/触发器/在我一直在使用的 ORM 框架中处理它许多人建议尽可能避免使用(ORM 除外)。

这是设计此表的错误方法吗?我应该在事件和用户之间有一个中间表来解决这个问题吗?

所以架构变得像这样;

user_event(**event_id**, **user_id**)
event(**event_id**, event_name...etc)
user(**user_id**, first_name...etc)

在这种情况下,我可以对 user_id 和 event_id 进行 auto_increment ,并在 user_event 中创建一条记录来链接两者(这种方式将需要更多的数据库读取)。另外,这个表最终会包含大量记录。

您对此有何想法和建议?

谢谢。

最佳答案

我无意详尽介绍数据库设计,但我认为(并希望)这种综合可以对您有所帮助。我刚刚写下来:

1) 一个表可以与另一个表存在 1:n 关系。 因此,在您的情况下,如果用户可以有 n 个事件,但该事件“属于”仅一个用户,您可以通过这种方式安排表格

CREATE TABLE USERS(USER_ID BIGINT NOT NULL AUTO_INCREMENT
,  FIRST_NAME ...)
;
ALTER TABLE USERS ADD PRIMARY KEY (USER_ID)
;

CREATE TABLE EVENTS (EVENT_ID BIGINT NOT NULL AUTO_INCREMENT
, USER_ID BIGINT
, ...);

ALTER TABLE EVENTS ADD PRIMARY KEY (EVENT_ID)

并且可能:

ALTER TABLE EVENTS ADD FOREIGN KEY (USER_ID) REFERENCES USERS(USER_ID);

2) 一个表可以与另一个表存在 n:m 关系。 因此,在您的情况下,如果用户可以有 m 个事件,但同一事件可以链接到其他用户,您可以以这种方式排列表,在大多数数据库中使用第三个表,通常称为“桥表”

CREATE TABLE USERS(USER_ID BIGINT NOT NULL
,  FIRST_NAME ...)
;
ALTER TABLE USERS ADD PRIMARY KEY (USER_ID)
;

CREATE TABLE EVENTS (EVENT_ID BIGINT NOT NULL
,  ...);
ALTER TABLE EVENTS ADD PRIMARY KEY (EVENT_ID)
;


CREATE TABLE BR_USERS_EVENTS(USER_ID BIGINT NOT NULL
, EVENT_ID BIGINT NOT NULL);
ALTER TABLE BR_USERS_EVENTS ADD PRIMARY KEY (USER_ID, EVENT_ID)
;

并且可能:

 ALTER TABLE BR_USERS_EVENTS ADD FOREIGN KEY (USER_ID) REFERENCES USERS(USER_ID);
 ALTER TABLE BR_USERS_EVENTS ADD FOREIGN KEY (EVENT_ID) REFERENCES EVENTS(EVENT_ID);

关于mysql - 我应该使用用户 ID 和事件 ID 作为复合主键吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44569988/

相关文章:

SQL : Create a full record from 2 tables

php - 如何在 Android + PHP json 请求中处理一系列价格

mysql - mysql BETWEEN OPERATOR 和 microsoft sql (MDB) BETWEEN OPERATOR 有什么区别

database - 什么是数据库中的水平分区和垂直分区,有什么区别?

sql-server - DBCC SHRINKFILE 会终止事件事务吗?

java - 特定应用种子数据群

mysql - 是否可以有一个表链接到一个使用外键链接回第一个表的表?

mysql - 错误1093(HY000): You can't specify target table for update in FROM clause

java - hibernate 生成的错误 sql 查询

Django Rest Framework,数据库查询优化