我正在开发具有多租户的SaaS应用程序,并且我决定使用单个数据库(MySQL Innodb)来获取客户端数据。我选择使用复合主键,如 PK(client_id,id)。我有两种方法,
1:由我自己(通过触发器或代码)增加“id”
或
2:通过mysql将“id”设为自动增量。
在第一种情况下,我将为每个客户端提供唯一的 id ,因此每个客户端将具有id 1,2,3等。 在第二种情况下,id将为所有客户增长。 这里的最佳做法是什么?我的优先事项是:绩效,安全和缩放。谢谢!
答案 0 :(得分:2)
您肯定希望使用自动增量id
值作为主键。这有很多原因。这是一些。
id
重复),则需要非常小心。花费精神能量 - 开发,质量保证,操作 - 使您的SaaS变得优秀,而不是重新发明主键上的爆胎。(client_id, id)
上添加索引。JOIN
操作将更易于编写,测试和维护。此查询模式非常适合从表中获取每个客户端的最新行。它表现得非常好。如果你生成自己的pks,那么做这种事情会更难。
SELECT t.*
FROM table t
JOIN (SELECT MAX(id) id
FROM table
GROUP BY client_id
) m ON t.id = m.id
答案 1 :(得分:1)
“PK(client_id,id)” -
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(client_id, id),
INDEX(id)
是的,这种组合可行。它会有效地工作。它不会为每个客户分配1,2,3,但这无关紧要。相反,连续的ID将分散在客户端中。
您的所有查询都可能包含WHERE client_id = (constant)
,对吗?这意味着将始终使用PRIMARY KEY(client_id, id)
,并且除了满足INDEX(id)
之外,不会使用AUTO_INCREMENT
。
此外,PK比INDEX(client_id, id)
更有效。 (这是因为InnoDB将PK与数据“聚集在一起”。)