Mysql 如何改进这个数据库,以及表之间的关系是否良好?

Mysql 如何改进这个数据库,以及表之间的关系是否良好?,mysql,database,schema,Mysql,Database,Schema,我将使用此数据库使用Laravel框架构建一个网站。根据我的经验,当您开发在线商店时,有关订单的信息应单独存储,而不是通过关系存储 让我举个例子: 我订购产品A,我的订单正在处理中,同时,您从数据库中删除产品A(不同的原因),如果您在我的订单中有产品id,会发生什么 此外,您应该为用户和付款详细信息创建一个交集表,因为他们可能有更多的信用卡。用户和送货地址的交集表也比文本栏更容易管理。根据我的经验,在开发在线商店时,有关订单的信息应该单独存储,而不是使用关系 让我举个例子: 我订购产品A,我的订


我将使用此数据库使用Laravel框架构建一个网站。

根据我的经验,当您开发在线商店时,有关订单的信息应单独存储,而不是通过关系存储 让我举个例子:

我订购产品A,我的订单正在处理中,同时,您从数据库中删除产品A(不同的原因),如果您在我的订单中有产品id,会发生什么


此外,您应该为用户和付款详细信息创建一个交集表,因为他们可能有更多的信用卡。用户和送货地址的交集表也比文本栏更容易管理。根据我的经验,在开发在线商店时,有关订单的信息应该单独存储,而不是使用关系 让我举个例子:

我订购产品A,我的订单正在处理中,同时,您从数据库中删除产品A(不同的原因),如果您在我的订单中有产品id,会发生什么


此外,您应该为用户和付款详细信息创建一个交集表,因为他们可能有更多的信用卡。用户和递送地址的交集表也比文本栏更容易管理,因为其他人提到这太宽泛了,无法回答

但我可以给你一些要记住的要点

标准化

这是关系的主要目的。基本上这不是复制数据,所以你不会在每个地址中都放一个状态,你会有一个状态表,把它的id放在地址中

你有一些,但你也可以过度正常化。比如支付状态。随着时间的推移,这些可能不会有太大的变化,因此您可以使用一个枚举字段,它基本上是一个文本字段,其中包含一个可接受值的列表

如果你有一对一的关系,你几乎不需要另一张桌子。我能想到的唯一原因是,当InnoDB没有全文支持时,您可以制作一个MyIsam表和一个InnoDB表来同时利用它们的优点。否则,它只会让事情变得更难,因为您有一个额外的连接,并且您必须让用户知道您的表不会变成多对一关系

你的例子是订单和送货地址,这可能是一对一的关系,不像你可以把同一件商品送到多个地址。你可能会想,我可以为不同的订单重复使用这些地址,但如果你阅读下面的内容,你可能会明白为什么这并不总是一个好主意。这并不是说你不能再次使用它们,你可能只是不应该允许对它们进行编辑,这可能会导致一系列问题

一致性

在处理订单之类的事情时,您应该尽可能多地将数据烘焙到表中。这是去规范化。但原因是,产品可以删除,地址可以更改等。您不希望这些事情影响您以后的订单。所以,通过烘焙这些数据,您不必担心无法更改这些内容。显然,你仍然想要一些像用户一样的链接,但你可能想在他们用于该订单的电子邮件中烘焙,这样,如果他们说我没有收到电子邮件,你可以知道使用了什么电子邮件,而不是他们目前拥有的,也许他们更改了它

层次结构

这是专门针对类别表的,您可能希望查看一些层次结构模型,如嵌套集或邻接列表。这将消除表并允许更多嵌套级别。设置起来有点困难,但它更灵活

另一种选择是使用类似于标签系统的东西,其中您有一个标签列表,并通过多对多关系将这些标签与产品关联起来。我想我们都知道标签是什么,但如果你不确定,那就看看堆栈溢出上的标签。这些可以帮助改进搜索结果,并帮助将相关产品联系在一起,即使它们属于不同的类别。例如,你可以

veggies > potatoes

utensils > potato peelers
它们是相关的,但您可能不会将它们归入同一类别


你甚至可以两者都用

正如其他人提到的,这一点太宽泛了,无法回答

但我可以给你一些要记住的要点

标准化

这是关系的主要目的。基本上这不是复制数据,所以你不会在每个地址中都放一个状态,你会有一个状态表,把它的id放在地址中

你有一些,但你也可以过度正常化。比如支付状态。随着时间的推移,这些可能不会有太大的变化,因此您可以使用一个枚举字段,它基本上是一个文本字段,其中包含一个可接受值的列表

如果你有一对一的关系,你几乎不需要另一张桌子。我能想到的唯一原因是,当InnoDB没有全文支持时,您可以制作一个MyIsam表和一个InnoDB表来同时利用它们的优点。否则,它只会让事情变得更难,因为您有一个额外的连接,并且您必须让用户知道您的表不会变成多对一关系

你的例子是订单和送货地址,这可能是一对一的关系,不像你可以把同一件商品送到多个地址。你可能会想,我可以为不同的订单重复使用这些地址,但如果你阅读下面的内容,你可能会明白为什么这并不总是一个好主意。这并不是说你不能再次使用它们,你可能只是不应该允许对它们进行编辑,这可能会导致一系列问题

一致性

在处理订单之类的事情时,您应该尽可能多地将数据烘焙到表中。这是去规范化。但原因是,产品可以删除,地址可以更改等。你不希望这些事情影响你的订单