Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要数据库结构建议_Php_Mysql_Database_Database Design - Fatal编程技术网

Php 需要数据库结构建议

Php 需要数据库结构建议,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我目前正在一个网站上工作,该网站将包含一个产品目录。我对数据库设计有点陌生,所以我正在寻找如何最好地实现这一点的建议。我熟悉关系数据库设计,所以我理解“多对多”或“一对多”等(在大学里上了一堂很好的数据库课)。以下是一个项目分类的示例: Propeller -> aircraft -> wood -> brand -> product. 与其尝试写我到目前为止已经写的东西,不如快速看一下我从phpmyadmin设计器特性创建的这个图像 现在,这一切似乎都很好,很漂亮,

我目前正在一个网站上工作,该网站将包含一个产品目录。我对数据库设计有点陌生,所以我正在寻找如何最好地实现这一点的建议。我熟悉关系数据库设计,所以我理解“多对多”或“一对多”等(在大学里上了一堂很好的数据库课)。以下是一个项目分类的示例:

Propeller -> aircraft -> wood -> brand -> product.
与其尝试写我到目前为止已经写的东西,不如快速看一下我从phpmyadmin设计器特性创建的这个图像

现在,这一切似乎都很好,很漂亮,直到我意识到“木材”类别也将用于螺旋桨->汽艇->(木材)下。这意味着,每当我想在不同的父级下使用“wood”时,都必须重新创建它。这并不是世界末日,但我想知道是否有一种更为理想的方式来实现这一点

此外,我正试图尽可能地保持这件事的动态性,以便客户可以在其需求发生变化时组织其目录


*编辑。正在考虑创建一个“标签”表。因此,我可以将标签“wood”或“metal”或“50inch”分配给1到多个项目。我仍然会为主要类别保留一个家长类型的东西,但这样类别就不必太深,也不会有重复。

如果你想让类别有多个家长类别,那么它只是一个“多对多”的关系,而不是“一对多”的关系。您需要在类别和自身之间放置一个桥接表


然而,我怀疑这是你想要的。如果我在类别Aircraft>Wood中查找,那么我不希望看到来自划船>Wood的项目。有两个木材类别,因为它们包含不同的项目。

在数据库中创建分层类别模型之前,请先了解其中的问题和解决方案(使用嵌套集)


总而言之,使用简单的父类\u category\u id无法很好地扩展,您将很难编写性能良好的SQL查询。答案是使用嵌套集,使您将多对多类别模型可视化为嵌套在其他集合中的集合。

我的建议

  • 在项目和类别之间建立多对多关系,以便在多层次节点中显示产品(用于易趣、sourceforge…)
  • 保持类别层次结构
类别层次结构上的绩效

如果类别层次结构是深度,则可以生成“祖先”表。此表将通过批处理生成,并包含:

  • ChildId(类别的id)
  • AncestorId(其父、祖父母、所有祖先类别的id)
这意味着如果你有3个类别:1螺旋桨>2飞机>3木材

然后,祖先表将包含:

ChildId  AncestorId
1        2
1        3
2        3
这意味着要拥有category1的所有子级,您只需要一个查询,而不需要执行嵌套查询。顺便说一句,无论您的类别层次结构有多深,这都是可行的

多亏了这个表,您只需要1个join就可以查询一个类别(及其子类别)

如果您需要关于如何创建祖先表的帮助,请告诉我


在创建层次结构之前 在数据库中的类别模型中,使用 看看哪一种解释 问题和解决方案(使用 嵌套集)

总之,使用一个简单的 父类\u类别\u id的伸缩性不强 好吧,你会很难过的 编写性能良好的SQL查询。这个 答案是使用嵌套集 让你想象你的多对多 类别模型作为集合 嵌套在其他集合中

值得指出的是,“多类别”的概念基本上就是“标记”的工作原理。除此之外,在“标签”中,我们允许任何产品都有许多类别。通过允许任何产品分为多个类别,您可以让客户完全能够通过开始在他们认为需要开始的地方筛选他们的搜索。它可能是点击“飞机”,然后点击“木头”,然后点击“涡轮喷气发动机”(或其他什么)。或者他们可以从木头开始搜索,得到同样的结果

这将为您提供最大的灵活性,客户将享受更好的,但仍然允许您维护层次结构。因此,虽然引用的答案建议将类别设为M:N至类别,但我的建议是允许产品改为设为M:N类别。

总的来说,结果基本相同,类别将具有自然的层次结构,但这将赋予更大的灵活性

我还应该注意到,这也不会阻止严格的层次结构。在必要的地方,您可以很容易地在代码中实施层次结构(例如,仅在初始页面上显示类别“汽车”、“飞机”和“船只”)。它只是将“strctity”转移到您的业务逻辑中,从长远来看,这可能会使它变得更好


编辑:我刚刚意识到你在回答中古怪地提到了这一点。我实际上没有注意到,但我认为这是你想做的。否则,您将两个层次结构系统混合到程序中,没有多少好处。

我以前也这样做过。我建议从标记开始(多对多关系表到产品)。您可以在标记(树、嵌套集或其他)之上构建层次关系,这比在产品上容易得多。因为标签是相对自由的形式,这也使您能够允许人们自然分类,然后编纂某些预期行为

例如,我们有像2009年11月特别的特殊标签。任何像这样的产品都有资格作为特价商品出现在 Points| x | y | z | =======+====+====+====+ | x1 | y1 | z1 | +----+----+----+ | x2 | y2 | z2 | +----+----+----+ | .. | .. | .. | | .. | .. | .. | +----+----+----+ | x8 | y8 | z8 | +----+----+----+