想象一下数据库设置,其中x个客户可以生成y个订单。 通常所有客户都会共享一组自动递增的订单ID。
我想为每位客户提供单独的订单ID。重要的是,客户无法根据ID看到有多少其他客户订购了。
现在,我能看到的唯一方法是手动选择客户订单号的最大值,添加+1然后手动插入。
select max(customer_order_id) from orders where customer_id = X
如何在数据完整性和规范化的意义上创建这种方法?比如为客户的各个订单ID进行某种自动增量?
create table customers
(
id int auto_increment primary key,
name varchar(255)
);
create table orders
(
id int auto_increment primary key,
customer_id int
customer_order_id int
foo varchar
bar varchar
);
答案 0 :(得分:1)
只需将订单号设为客户编号,然后输入序列号即可。所以如果我是客户103985,我的第一个订单是103985-0001,我的第二个订单是103985-0002。规范化数据 - 按顺序,分别存储客户编号和序列号。将它们组合起来进行展示。
答案 1 :(得分:0)
听起来你想要一个基本的关系结构或只是一个slug字段来选择。
因此,您的订单表可以具有对客户透明的自动增量ID。根据您计划提供数据的方式,您可以轻松使用组合用户数据的slug系统来查找正确的记录。
因此,例如,基于url的请求 - somesite.com/orders/{user_id}/1将选择用户ID是登录用户的位置,订单slug是1. {user_id}可以存在或省略,具体取决于如何选择授权查看页面。所以管理员可以通过获取变量进行查看,非管理员必须对此变量进行验证......但这可能与此无关。
或者,您可以使用varchar来处理订单ID并组成一个完全无法解析的字符串。根据您网站的规模,这可能不是问题。
您唯一担心的是用户B的订单ID为100,您不希望他们知道之前有99个其他订单吗?如果是这样,这里的任何答案都适合你。
答案 2 :(得分:0)
使用InnoDB相对于MyISAM有几个优点,但如果您使用的是MyISAM引擎,则可以使用自动生成的复合主键。
来自dev.mysql.com: example-auto-increment.html:
对于 MyISAM和BDB表格,您可以在多列索引中的辅助列上指定
AUTO_INCREMENT
即可。在这种情况下,AUTO_INCREMENT
列的生成值计算为MAX(auto_increment_column) + 1 WHERE prefix=given-prefix
。当您想要将数据放入有序组时,这非常有用。
在你的情况下,它会是这样的:
CREATE TABLE customers
(
id int auto_increment PRIMARY KEY,
name varchar(255)
);
CREATE TABLE orders
(
customer_id int,
customer_order_id int auto_increment,
...
PRIMARY KEY (customer_id, customer_order_id)
);
如果您想要与InnoDB具有相同的功能,则必须使用触发器。