【问题标题】:How can i Improve this database , and the relations between the tables is it fine? [closed]我该如何改进这个数据库,表之间的关系是否正常? [关闭]
【发布时间】:2020-01-08 05:43:09
【问题描述】:

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

【问题讨论】:

  • 发布带有一些示例数据的 DBfiddle 会更好。 db-fiddle.com 只是查看它,您有一些冗余数据,数据库的主要目标是规范化数据,因此如果您有一对一,那么您实际上并不需要单独的表(除非您需要单独的引擎) ,如 InnoDB 和 MyIsam),(如收货地址)。那么状态可以是一个 ENUM 字段,您将拥有多少状态以及它们多久更改一次。它们可能永远不会改变,你可能只有 4 或 5 个。
  • 这样的问题存在一个问题:没有上下文,如果某事有意义与否,很难给出建议。至少如果您的问题不仅仅是关于您是否遵守正常形式。根据您所需的业务逻辑,可能会有所改进的是使付款详细信息成为用户可以存储以供以后使用的永久内容。此外,类别系统感觉有点奇怪,您可能应该为此使用递归表(这使您在子类别的深度方面具有更大的灵活性)。但如前所述,很难在没有上下文的情况下给出建议。
  • 我不喜欢分类系统,我更喜欢使用标签系统。一方面它是扁平的,另一方面你可以拥有无​​限的标签。我也同意付款细节需要一些工作,payment_detailsuser_payment_details 之间没有关系
  • @ArtisticPhoenix 感谢您的回答我尝试使用 DBfiddle (www.db-fiddle.com) 但我遇到了很多错误,因为我使用 dbdesigner (dbdesigner.net) 只是为了设计数据库,我不是现在正在处理查询。我知道数据库中有很多一对一的关系,当我创建网页时,我正在使用这些表来填充表单中的选择标签
  • 你创建了表,你可以做SHOW CREATE TABLE tablename,结果将是sql创建表。在 PHPmyAdmin 中,您必须单击“显示全文”才能看到整个内容。

标签: mysql database schema


【解决方案1】:

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

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

另外,您应该为用户和付款明细创建一个交集表,他们可能有更多的信用卡。用户和收货地址的交集表也比文本列更容易管理

【讨论】:

  • 我会添加它应该“烘焙”到订单中,这样如果您稍后更改产品,它不会影响计费,如果您需要,您可以删除产品并中断所有订单他们有关系。
【解决方案2】:

正如其他人提到的那样,这太宽泛了,无法回答。

但我可以给你一些要记住的提示。

归一化

这是关系的主要目的。基本上这不是重复数据,因此您不会在每个地址中都放置一个状态,您将拥有一个状态表并将其 id 放入地址中。

你有一些这样的,但你也可以过度规范化。比如付款状态。这些可能不会随着时间的推移而发生很大变化,因此您可以使用 ENUM 字段,该字段基本上是一个文本字段,其中包含可接受值的列表。

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

您的示例是订单和收货地址,这可能是一对一的,您不能将相同的物品运送到多个地址。您可能在想,我可以将这些地址重复用于不同的订单,但是如果您阅读下面的内容,您可能会明白为什么这并不总是一个好主意。这并不是说您不能再次使用它们,您只是可能不应该允许对它们进行编辑,这可能会导致一连串的问题。

一致性

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

层次结构

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

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

veggies > potatoes

utensils > potato peelers

它们是相关的,但您可能不会将它们归为同一类别。

你甚至可以同时使用!

【讨论】:

  • 谢谢,这真的很有用。虽然,我不明白如何烘焙数据,如果你能给我一个例子,如何从一个表到另一个表烘焙日期,我将不胜感激,关于产品类别的层次结构就像这个产品有类型,类型有子类别,子类别有类别示例:产品->牛津->鞋->服装,如果我做错了请指导我。
  • 我的意思是bake data 是你把数据放在表中而不是用 id 引用它,它是烘焙的,不会改变等等。`请指导我`这是网站关于特定的编程问题,这就是为什么不鼓励这样的问题,有很多教程和视频可以做得更好,然后我可以解释它。
  • 好的明白了,谢谢。
猜你喜欢
  • 2017-06-12
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2016-03-12
相关资源
最近更新 更多