如何正确拆分大型sql表

时间:2017-01-09 23:14:46

标签: mysql sql database

我正在尝试设计一个必须处理5种不同类型订单的数据库,我将要有一个大订单表,其中包含每种类型或订单的字段,但它太大了。

我想到的方式如下所示,每个订单都有一个唯一的ID,下订单的人的ID和order_type表的id,这是订单细节的存储位置。

顺序
ID
user_id(USER.id的外键)
order_date的
order_type2_id(ORDER_TYPE1.id的外键)
order_type3_id(ORDER_TYPE2.id的外键)
order_type4_id(ORDER_TYPE3.id的外键)
order_type5__id(ORDER_TYPE4.id的外键)
order_type6_id(ORDER_TYPE5.id的外键)

order_type1
ID

order_type2
ID

order_type3
ID

order_type4
ID

order_type5
ID

将所有数据存储在一个大表中是否更好并将未使用的字段归零或者我是否在正确的轨道上通过使用单独的表并以某种方式连接它们。正确的方向上的一点很好,因为我觉得我的解决方案不正确。

2 个答案:

答案 0 :(得分:0)

在事务方面可能更简单,只有一个表,通常只转换为业务层中的一个对象。如果出于某种原因需要在某个时刻提取所有订单,则不需要加入。如果空间是可变的,那么空区域不会占用太大的空间,固定的区域占据与其宽度相同的空间。

答案 1 :(得分:0)

这是数据库设计和规范化的问题。

您需要回答基本的数据库设计问题,例如:

  • 数据库中不同订单类型的用途是什么?
  • 不同的订单类型包含哪些数据?
  • 每种订单类型的数据是否存在结构差异?
  • 如何使用订单类型中的数据?
  • 订单类型是每个订单的必填字段吗?

另外,我建议你追逐一个过于复杂的概念,了解你的终端数据库需要什么。

考虑一下...... 如果5个订单类型的数据结构相同,那么您实际上只需要一个订单类型字段。

order_table id (primary key BIGINT(10) UNSIGNED NOT NULL AUTO_INCREMENT,) user_id (foreign key to USER.id BIGINT(10) UNSIGNED NOT NULL) order_date (DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',) order_type_id (foreign key to order.type TINYINT(1) UNSIGNED NOT NULL)

通过应用程序代码

处理联接
  • 如果订单类型为0,则在订单表0上加入查找订单ID
  • 如果订单类型为1,则在订单表1上加入查找订单ID
  • 如果订单类型为2,则在订单表2上加入查找订单ID
  • 如果订单类型为订单表3上的3个连接,并且具有查找订单ID
  • 如果订单类型为订单表4上的4加入,且查询订单ID为

但关键是你没有提供足够的信息来正确评估数据库设计以及如何将规范化应用于表来处理当前Order表超出主机mysql限制的问题(可能考虑不同的主机或VPS托管选项)。

额外阅读https://www.codeproject.com/articles/359654/important-database-designing-rules-which-i-fo