WooCommerce商城开发:高性能订单存储数据库模式

news2024/9/22 11:29:19

这是一系列深入探讨的第一部分,专门用于解释高性能订单存储数据库模式的实施。

与1 月份提出的版本相比,数据库模式的变化很小。我们在不同的地方添加和删除了几列,但整体表结构与第一个提案中描述的相同:

我们在此项目中添加了4 个表:

  1. 主订单表
  2. 订单地址表
  3. 订单操作表
  4. 订单元表

该解决方案应该可以显着加快数据写入和读取速度:以前,每个新订单都需要对表中的记录进行一次 INSERT posts + 对每条postmeta记录进行近 40 个 INSERT。新的数据结构最多需要 5 个 INSERT。 

对多订单搜索,我们不得不多次将postmeta表与posts表连接起来(例如,跨地址字段和客户电子邮件地址进行搜索)。现在,搜索需要更少的连接,并且连接的表与postmeta表相比要小得多。

目录  隐藏 

主订单表

代码

订单地址表

代码

订单操作表

代码

订单元数据表

代码

关于订单的注意事项

订购商品

主订单表

主订单表包含以前存储在表中的所有数据wp_posts,并为最常用的元值添加列。 

自上次提议以来,我们删除了post_id列,因为wc_order.id始终与相应的post.ID相匹配,因此post_id不再需要。

我们还添加了:

  • type列以正确支持退款(这是一种订单类型,建模为父订单的子订单,就像以前的帖子一样)。 
  • customer_note用于存储客户可以在结帐过程中留下的注释的列
Column NameTypeDescriptionExample values
idbigint(20) unsignedUnique ID for order.1, 5, 143
statusvarchar(20)Status for the order.‘wc-processing’, ‘wc-completed’, ‘wc-refunded’
currencyvarchar(10)Currency identifier in which payment was received.‘GBP’, ‘USD’, ‘ZAR’
typevarchar(20)‘shop_order’, ‘shop_order_refund’
tax_amountdecimal(26,8)Total order tax amount12.45, 5.0
total_amountdecimal(26,8)Total order total, including tax15.66, 10.0
customer_idbigint(20) unsignedCustomer ID (0 in case of guest checkout)1, 5, 12
billing_emailvarchar(320)Billing email for customer‘john@doe.com’
date_created_gmtdatetimeTimestamp when order was created‘2021-12-31 23:59:59.999999’, ‘2022-04-31 23:59:59’
date_updated_gmtdatetimeTimestamp when the order or any of its properties were last updated‘2021-12-31 23:59:59.999999’, ‘2022-04-31 23:59:59’
parent_order_idbigint(20) unsignedOrder ID of the parent, in case this order is a refund
payment_methodvarchar(100)Identifier of payment method‘bacs’, 
payment_method_titletextTitle of payment method used‘Direct Bank Transfer’, 
transaction_idvarchar(100)Transaction ID provided by the payment gateway.‘ch_1HbohKHMqnIERF7AtGikC32B’
ip_addressvarchar(100)IP address used to create the order‘1.2.3.4’
user_agenttextThe user-agent string of the web client that was used to create the order.‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36’, ‘Scrapy/2.6 (+https://scrapy.org)’
customer_notetextStores the customer note added during the checkout flow.‘Call me on my cell once you ship the widget please’

代码

CREATE TABLE $wpdb->prefix.'wc_orders' (
 
    id BIGINT(20) UNSIGNED,
    status VARCHAR(20) NULL,
    currency VARCHAR(10) NULL,
    type VARCHAR(20) NULL,
    tax_amount DECIMAL(26, 8) NULL,
    total_amount DECIMAL(26, 8) NULL,
    customer_id BIGINT(20) UNSIGNED NULL,
    billing_email VARCHAR(320) NULL,
    date_created_gmt DATETIME NULL,
    date_updated_gmt DATETIME NULL,
    parent_order_id BIGINT(20) UNSIGNED NULL,
    payment_method VARCHAR(100) NULL,
    payment_method_title TEXT NULL,
    transaction_id VARCHAR(100) NULL,
    ip_address VARCHAR(100) NULL,
    user_agent TEXT NULL,
    customer_note TEXT NULL,
 
    PRIMARY KEY (id),
    KEY status (status),
    KEY date_created (date_created_gmt),
    KEY customer_id_billing_email (customer_id, billing_email),
    KEY billing_email (billing_email),
    KEY type_status (type, status),
    KEY parent_order_id (parent_order_id),
    KEY date_updated (date_updated_gmt)
);

订单地址表

订单地址表用于存储最终客户的帐单地址和送货地址。

我们从表中省略了date_created_gmt,因为该信息将存储在主订单表中。

Column NameTypeDescriptionExample Values
idbigint(20) unsignedUnique ID for order address record.1, 5
order_idbigint(20) unsignedOrder ID.3, 8
address_typevarchar(20)Type of address (billing, shipping, etc).‘billing’, ‘shipping’
first_nametextFirst name‘John’
last_nametextLast name‘Doe’
companytextCompany name‘John Doe Ltd.’
address_1textAddress line 1‘Oaktree rd.’
address_2textAddress line 2
citytextCity‘New York’
statetextState‘NY’
postcodetextPostcode/ZIP Code‘10019’, ‘E14 3QS’
countrytextCountry code from i18n/countries.php‘US’, ‘UK’
emailvarchar(320)Email‘john@doe.com’
phonevarchar(100)Phone number‘1-500-2345’

代码

CREATE TABLE $wpdb->prefix.'wc_order_addresses' (
     
    id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id BIGINT(20) UNSIGNED NOT NULL,
    address_type VARCHAR(20) NULL,
    first_name TEXT NULL,
    last_name TEXT NULL,
    company TEXT NULL,
    address_1 TEXT NULL,
    address_2 TEXT NULL,
    city TEXT NULL,
    state TEXT NULL,
    postcode TEXT NULL,
    country TEXT NULL,
    email VARCHAR(320) NULL,
    phone VARCHAR(100) NULL,
 
    KEY order_id (order_id),
    UNIQUE KEY address_type_order_id (address_type, order_id),
    KEY email (email),
    KEY phone (phone)
);

订单操作表

Order Operational Table 存储我们用来维护内部订单状态的字段和标志。我们将这些字段与核心订单表分开,因为这些字段将来可能会根据内部实施细节进行更改。

在操作表中,有一列被重命名(download_permissions_granted被重命名为download_permmission_granted,注意权限中缺少s),还有一列被添加到recorded_sales,因为它存储在大多数订单中,但在原始提案中被省略了。

Column NameDetailDescriptionExample
idbigint(20) unsigned1, 5
order_idbigint(20) unsigned3, 8
created_viavarchar(100)The identifier for order creation source. WC core uses the following values:
– admin 
– checkout
– rest-api
– store-api
‘admin’, ‘checkout’
woocommerce_versionvarchar(20)WooCommerce version which was active when creating the order. Postmeta previously called `_order_version`‘4.6.0’, ‘6.7.0’
prices_include_taxtinyint(1)For internal use. Whether prices included taxes when purchased.0, 1
coupon_usages_are_countedtinyint(1)For internal use. Whether coupon usage is counted.0, 1
download_permission_grantedtinyint(1)Marks whether download permissions are granted to order or not.0, 1
cart_hashvarchar(100)Hash of cart contents, used when clearing cart when order payment is successful.‘010ae06d098de5f270bd27cc69721576’
new_order_email_senttinyint(1)Whether an email is sent for the order0, 1
order_keyvarchar(100)Key used to allow anonymous order access for payment and related operations.‘wc_order_jIe6po8pcXvZh’
order_stock_reducedtinyint(1)Whether the stock is reduced for order0, 1
date_paid_gmtdatetimeTimestamp when the order was first moved into any of the paid statuses.‘2021-12-31 23:59:59.999999’, ‘2022-04-31 23:59:59’
date_completed_gmtdatetimeTimestamp when the order was last moved into completed status.‘2021-12-31 23:59:59.999999’, ‘2022-04-31 23:59:59’
shipping_tax_amountdecimal(26,8)Total shipping tax12.34
shipping_total_amountdecimal(26,8)Total shipping amount, including tax45.69
discount_tax_amountdecimal(26,8)Total discount tax54.23
discount_total_amountdecimal(26,8)Total discount amount, including tax12.23
recorded_salestinyint(1)Stores information about whether sales were recorded.0, 1

代码

CREATETABLE$wpdb->prefix.'wc_order_operational_data'(

    id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARYKEY,

    order_id BIGINT(20) UNSIGNED NULL,

    created_via VARCHAR(100) NULL,

    woocommerce_version VARCHAR(20) NULL,

    prices_include_tax TINYINT(1) NULL,

    coupon_usages_are_counted TINYINT(1) NULL,

    download_permission_granted TINYINT(1) NULL,

    cart_hash VARCHAR(100) NULL,

    new_order_email_sent TINYINT(1) NULL,

    order_key VARCHAR(100) NULL,

    order_stock_reduced TINYINT(1) NULL,

    date_paid_gmt DATETIME NULL,

    date_completed_gmt DATETIME NULL,

    shipping_tax_amount DECIMAL(26, 8) NULL,

    shipping_total_amount DECIMAL(26, 8) NULL,

    discount_tax_amount DECIMAL(26, 8) NULL,

    discount_total_amount DECIMAL(26, 8) NULL,

    recorded_sales TINYINT(1) NULL,

    UNIQUEKEYorder_id (order_id),

    UNIQUEKEYorder_key (order_key)

);

订单元数据表

该表在功能上与wp_postmeta表类似,充当扩展数据的数据存储(除非扩展创建自己的表)。

与之前的提议相反,我们决定省略date_created_gmt,因为这些将存储在父订单中。

Column NameTypeDescriptionExample Values
idbigint(20) unsignedUnique ID for meta record.1, 5
order_idbigint(20) unsigned, indexedCorresponding order ID.3, 8
meta_keyvarchar(255)Name of the key.‘_stripe_customer_id’
meta_valuetextValue of the record.‘cus_ICD8cAbkdVKbZF’

代码

CREATETABLE$wpdb->prefix.'wc_orders_meta'(

    id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARYKEY,

    order_id BIGINT(20) UNSIGNED NULL,

    meta_key VARCHAR(255),

    meta_value TEXT NULL,

    KEYmeta_key_value (meta_key, meta_value(100)),

    KEYorder_id_meta_key_meta_value (order_id, meta_key, meta_value(100))

)

关于订单的注意事项

我们决定从项目范围中删除订单注释,因为我们认为它们不是大多数与订单相关的数据库操作的瓶颈。我们也不认为wp_comments当前存储它们的表通常会收到与订单备注竞争的大量写入流量。因为我们已经决定强制执行 posts 表中的订单 ID = 新表中的订单 ID 的不变性,所以我们不需要重新绑定订单注释以指向正确的订单。如果需要,我们计划根据进一步的性能测试和来自社区的反馈来处理订单备注。

订购商品

Order Items 已经有自己的专用表,它们超出了本项目的范围。

点击阅读 WooCommerce商城开发:高性能订单存储数据库模式 原文 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/511205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机(九)LED点阵屏

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&#xff0…

RabbitMQ消息队列实战(5)—— 发后即忘和远程RPC数据传输模型

本文我们学习下使用RabbitMQ实现的几种数据发送的模型——发后即忘模型和远程RPC调用。二者实际上是从业务的角度定义的一个RabbitMQ的使用模型。发后即忘模型,强调发送时不太关心消息接收者的执行结果,仅仅是为了发送信息。而远程RPC调用模型强调&#…

vulnhub靶场之double:1

1.信息收集 探测存活主机,发现192.168.239.178存活 对目标主机192.168.239.176进行端口扫描,发现存活22(SSH)、25(smtp)、80、8080端口。 浏览器访问http://192.168.239.178,发现有两个链接。查看源码发现一个是跳转到/production&#xf…

David Silver Lecture 6: Value function approximation

1 Introduction pipeline大致讲完了,开始到数值计算的部分。 1.1 大规模的运算 对于这种大规模运算,如何拓展前面两个章节的内容,进行实战。 1.1.1 回顾value function approximation 1.1.3 which function approximator 强化学习中的值函…

java源码----集合系列1----ArrayList,linkedList

Arraylist 基础信息 底层是一个object数组 Arraylist 是java里面Collection 标准的一个集合,其底层是一个object数组。当new一个空参的ArrayList的时候,会默认生成一个空数组。 Arraylist上限是 Integer.MAX_VALUE - 8(Integer.MAX_VALUE 2^31-1);…

一文搞定接口测试及常用接口测试工具解析

目录 首先,什么是接口呢? 一、常见接口: 二、前端和后端: 三、什么是接口测试: 四、接口组成 五、为什么要做接口测试: 六、接口测试怎么测: 七、用什么工具测 首先,什么是接…

软件工程开发文档写作教程(06)—项目建议书写作规范

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 项目建议书概述 项目建议书一般是由主策划或者项目经理负责编写的。进行可行性分析是一个自…

3.编写油猴脚本之-helloword

3.编写油猴脚本之-helloword Start 通过上一篇文章的学习,我们安装完毕了油猴插件。今天我们来编写一个helloword的脚步,体验一下油猴。 1. 开始 点击油猴插件>添加新脚本 默认生成的脚本 // UserScript // name New Userscript // name…

Linux介绍及环境搭建

文章目录 🎬1.Linux背景💻1.1 计算机的发展💻1.2 操作系统的故事💻1.3 Linux操作系统💻1.4 Linux的应用场景💻1.5 Linux版本 🔌2. Linux环境💾2.1 环境选择💾2.2 云服务器…

u1s1,查问题已经从百度到Google,再从Google到gpt了

现在查问题,查资料,基本都是问gpt。 感觉AI的回答会比较智能。 除了解释说明,还会附录Demo源码。 而且没有广告和其他杂七杂八的。 方便/快捷,提高了工作效率。 举例 上传图片后无法渲染的文章,发现数据库的图片地址前缀带blob,可…

数据结构-查找-线性结构(顺序、折半、分块)查找

目录 一、顺序查找 *查找效率分析 二、折半查找 *查找效率分析 三、分块查找 *查找效率分析 一、顺序查找 有称线性查找, 算法思想:从头到尾挨个查找(反过来也行) typedef struct{int *elem; //数据int TableLen; …

MySQL原理(六):日志

前言 上一篇介绍了 MySQL 的锁,这一篇将介绍日志相关的内容。 MySQL 中最常见的日志有三类: undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 …

MATLAB程序在设备端部署实例

背景介绍 MATLAB广泛应用于物理系统建模、测量测试、系统控制以及深度学习等,在工程实践中具有非常重要的地位,具体如图1所示。调研发现,科研人员能够编写各种matlab代码,通过建模仿真来更好的认识世界。近年来,随着物…

《LeetCode》—— 摆动序列

今天,我们要讲解的是 “摆动序列” 这道题目。对于这道题目,我们可以从贪心的思想去解决,也可以使用动态规划的方法。接下来,我通过这两种方法的讲解让你轻松拿捏它! 目录 (一)贪心算法 1、上下…

跑在笔记本里的大语言模型 - GPT4All

何为GPT4All GPT4All 官网给自己的定义是:一款免费使用、本地运行、隐私感知的聊天机器人,无需GPU或互联网。 从官网可以得知其主要特点是: 本地运行(可包装成自主知识产权🐶)无需GPU(穷人适配…

sort、uniq、tr、cut的使用

管理文件内容的使用 一、sort命令二、uniq命令三、tr命令四、cut命令 一、sort命令 sort命令是以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序,比较原则是从首字符向后,依次按ASCII码进行比较,最后将他们按升序输…

Linux:rpm查询安装 yum安装

环境: 需要插入安装镜像 镜像内有所需的安装库 我这里使用的虚拟机直接连接光盘 连接的光盘挂载在/dev/cdrom 由于我们无法直接进入,所以选择把/dev/cdrom挂载到别的地方即可 mount /dev/cdrom /123 将/dev/cdrom 挂载到 /123 目录下 Packages下就是…

C++笔记—— 第十七篇 智能指针 C++11来了(下)

目录 1. 为什么需要智能指针 2. 内存泄漏 2.1 什么是内存泄漏,内存泄漏的危害 2.2 内存泄漏分类 2.3如何避免内存泄漏 3.智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_ptr 3.4 std::unique_ptr 3.5 std::shared_ptr shared_ptr的线…

JVM性能调优

一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参…