2012-02-10 63 views
0

想象一下数据库设置,其中x个客户可以做出y次订单。通常所有客户都会共享一组自动递增的订单ID。我如何为每个客户ID设置单独的订单ID?

  • 客户A的第一顺序具有顺序ID#1
  • 客户B的第一阶具有订单ID#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 
); 

回答

1

只需将订单号码作为客户号码后跟一个序列号即可。所以如果我是客户103985,我的第一个订单是103985-0001,我的第二个订单是103985-0002。对数据进行标准化 - 按顺序分别存储客户编号和序列号。结合它们进行显示。

+0

是的,非常感谢您的回复。我仍然有一个问题:我如何正确增加每个客户的单独序列,而不选择max()并在php中添加+1,然后插入它? – user1201008 2012-02-10 01:16:40

+0

您可以跟踪客户记录中的“最后订单顺序”,但我认为选择max并添加一个更好。 – 2012-02-10 01:30:02

+0

好的,谢谢! – user1201008 2012-02-10 01:55:41

0

这听起来像你想要一个基本的关系结构或简单地选择一个slug字段。

所以你的订单表可以有一个对客户透明的自动增量ID。根据您计划如何处理数据,您可以轻松使用组合用户数据的子弹系统来查找正确的记录。

因此,例如,基于url的请求 - somesite.com/orders/{user_id}/1将选择用户ID是登录用户的位置,并且订单slug为1. {user_id}可以存在或省略取决于您选择授权查看该页面的方式。所以管理员可以通过get vars来查看,而非管理员必须对此var进行验证......但这可能并不重要。

或者,您可以使用varchar来处理订单ID并组成完全不可识别的字符串。根据您网站的规模,这可能不成问题。

您唯一担心的是用户B的订单ID为100,您不希望他们知道之前有99个其他订单?如果是这样,这里的任何答案都适合你。

+0

非常感谢您的回复。我只是希望每个客户都有一个干净的,单独的订单号码1,2,3 .... 100。我根本没有得到如何适当增加每个客户的单独序列,而不选择max()并在php中添加+1然后插入它? – user1201008 2012-02-10 01:27:46

0

在MyISAM上使用InnoDB有几个优点,但如果您使用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的相同的功能,你将不得不使用触发器。