我正在设计一个多租户MySQL数据库。我的方法是为所有租户使用单个数据库,并在每个表中有一个租户ID
列来分隔每个租户的数据。
对于某些表,我需要在特定租户中生成一系列连续参考号。
例如,我有一个名为book
的表,其中包含以下列:租户ID
和book
REF
。 Book
REF
用于唯一识别租户中的book
。假设有2个租户:租户1和租户2.每个租户都有一些书。现在我希望每个租户中的book
REF
像1,2,...
显然,book.REF
在这种情况下并不是真正的ID
,因为它们中的一些在租户1中与租户2中的一些相同。但由于它们被租户ID
分开,它将起作用。
我不能为book
REF
使用'auto_increment PRIMARY KEY',因为它会在book
REF
的租户中留下“漏洞”。
简而言之,book
REF
有2个要求:
您认为这样一个目标的好方法是什么?
最好的方法可能是触发器,即使它在重负载下也不是很安全。
如果同一个租户从10台PC上插入1M书,你可能会找到一个重复的密钥,所以一定要用CREATE UNIQUE INDEX idxu_book ON book(id,ref)
来避免这个
无论如何,这是一个触发器,为每个ID租户制作序列:
DELIMITER $$
CREATE TRIGGER `tgi_book_ref_seq` BEFORE INSERT ON `book`
FOR EACH ROW
BEGIN
SET NEW.ref = (
SELECT COALESCE(MAX(ref), 0)+1
FROM book
WHERE id = NEW.id
);
END $$
DELIMITER ;