我正在为项目创建数据库。
阅读数据库设计时请记住,这不是我的强项。
我有一个事件表和一个用户表,每个用户可以创建任意数量的事件。我的问题是,设计这张 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/