复合主键和自动递增?什么是好的做法?

时间:2016-05-18 16:50:59

标签: mysql database-design relational-database database-schema saas

我正在开发具有多租户的SaaS应用程序,并且我决定使用单个数据库(MySQL Innodb)来获取客户端数据。我选择使用复合主键,如 PK(client_id,id)。我有两种方法,

1:由我自己(通过触发器或代码)增加“id”

2:通过mysql将“id”设为自动增量。

在第一种情况下,我将为每个客户端提供唯一的 id ,因此每个客户端将具有id 1,2,3等。 在第二种情况下,id将为所有客户增长。 这里的最佳做法是什么?我的优先事项是:绩效,安全和缩放。谢谢!

2 个答案:

答案 0 :(得分:2)

您肯定希望使用自动增量id值作为主键。这有很多原因。这是一些。

  1. 如果您自己生成竞争条件(意外id重复),则需要非常小心。花费精神能量 -​​ 开发,质量保证,操作 - 使您的SaaS变得优秀,而不是重新发明主键上的爆胎。
  2. 即使不是PK,您仍然可以在(client_id, id)上添加索引。
  3. 您的JOIN操作将更易于编写,测试和维护。
  4. 此查询模式非常适合从表中获取每个客户端的最新行。它表现得非常好。如果你生成自己的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与数据“聚集在一起”。)

相关问题