如何为每个客户ID提供单独的订单ID?

时间:2012-02-10 01:04:38

标签: mysql data-modeling

想象一下数据库设置,其中x个客户可以生成y个订单。 通常所有客户都会共享一组自动递增的订单ID。

  • 客户A的第一个订单有订单ID#1
  • 客户B的第一个订单的订单号为#2。

我想为每位客户提供单独的订单ID。重要的是,客户无法根据ID看到有多少其他客户订购了。

  • 客户A的第一个订单有订单ID#1
  • 客户A的第二个订单具有订单ID#2
  • 客户B的第一个订单具有订单ID#1

现在,我能看到的唯一方法是手动选择客户订单号的最大值,添加+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
);

3 个答案:

答案 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具有相同的功能,则必须使用触发器。