【问题标题】:How can i have individual order IDs for each customer ID?我如何为每个客户 ID 设置单独的订单 ID?
【发布时间】:2012-02-23 04:51:18
【问题描述】:

想象一个数据库设置,其中 x 个客户可以下 y 个订单。 通常所有客户都会共享一组自动递增的订单 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
);

【问题讨论】:

    标签: mysql data-modeling


    【解决方案1】:

    只需将订单号设为客户编号,后跟序列号即可。所以如果我是客户 103985,我的第一个订单是 103985-0001,我的第二个订单是 103985-0002。规范化数据——在一个订单中,分别存储客户号和序列号。将它们组合起来展示。

    【讨论】:

    • 是的,非常感谢您的回复。不过我还有一个问题:如何在不选择 max() 并在 php 中添加 +1 然后插入的情况下正确地为每个客户增加单独的序列?
    • 您可以在客户记录中跟踪“最后订单顺序”,但我认为最好选择最大并添加一个。
    【解决方案2】:

    听起来您想要一个基本的关系结构,或者只是一个可供选择的 slug 字段。

    因此,您的订单表可以有一个对客户透明的自动增量 ID。根据您计划提供数据的方式,您可以轻松使用组合用户数据的 slug 系统来查找正确的记录。

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

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

    您唯一关心的是用户 B 的订单 id 为 100,您不想让他们知道之前还有 99 个其他订单吗?如果是这样,这里的任何答案都对你有用。

    【讨论】:

    • 非常感谢您的回复。我只是希望每个客户都有一个干净、独立的订单号序列 1,2,3....100。我根本不知道如何在不选择 max() 并在 php 中添加 +1 然后插入它的情况下为每个客户正确增加单独的序列?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2018-08-26
      • 1970-01-01
      • 2023-01-21
      相关资源
      最近更新 更多