Mysql 多个一对多关系的正确模式?

Mysql 多个一对多关系的正确模式?,mysql,database-design,database-schema,Mysql,Database Design,Database Schema,我试图找出如何正确地为数据库中的一行创建多个一对多关系 假设我有一个产品表 CREATE TABLE `product` ( `productID` int(11) NOT NULL AUTO_INCREMENT, `productName` varchar(45) NOT NULL, PRIMARY KEY (`productID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 产品可以具有一对一类别关系或一对多类别关系 CREATE TABLE `catego

我试图找出如何正确地为数据库中的一行创建多个一对多关系

假设我有一个产品表

CREATE TABLE `product` (
`productID` int(11) NOT NULL AUTO_INCREMENT,
`productName` varchar(45) NOT NULL,
PRIMARY KEY (`productID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
产品可以具有一对一类别关系或一对多类别关系

CREATE TABLE `category` (
`categoryID` int(11) NOT NULL AUTO_INCREMENT,
`categoryName` varchar(45) NOT NULL,
PRIMARY KEY (`categoryID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我已经用外键创建了一个查找表,但我认为它不会起作用,因为可能存在与各种不同类别组关联的产品

CREATE TABLE `category_to_product` (
`categoryID` int(11) NOT NULL,
`productID` int(11) NOT NULL,
KEY `categoryID` (`categoryID`),
KEY `productID` (`productID`),
CONSTRAINT `category_to_product_ibfk_2` FOREIGN KEY (`productID`) 
REFERENCES `product` (`productID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `category_to_product_ibfk_1` FOREIGN KEY (`categoryID`) 
REFERENCES `category` (`categoryID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
编辑


我的数据库中的查询是基于级别的,每个更高级别的查询都依赖于上一级别。级别1将是一个基本级别的查询,并且将包含最一般的信息,假设这个类别是电子产品

二级查询是一个稍微精细一些的查询,是电子产品的一个子类,比如电子产品->电视。把它想象成面包屑。这本身似乎很难做到,但在这种情况下,产品需要能够关联到几个不同的类别组,这些类别组可以包含相同级别或不同级别。我希望这是有道理的



我如何为这种关系构建数据库?最初,我在查找表中的不同列下将类别级别分开,这很好地工作,但有太多的空值。

您的示例指定了第三个表,但首先您需要为类别到产品表添加主键(*
id
int(11)NOT NULL AUTO\u INCREMENT)

第三个表格为各组:

创建表
category\u to\u product\u group
(
id
int(11)非空自动增量,
categoryProductGroupName
varchar(40),
category\u to\u product\u id
int(11)不为空, )引擎=InnoDB默认字符集=utf8


第三个表中的每个组名称有多行(一个组可以是一个或多个类别到产品行)。

您的方法非常通用。产品在模型中没有任何固定属性(名称除外),但有一组可选的关联属性。因此,可能会有颜色和材质未知的裤子。或者是一台棉制的电脑和一条锡制的裤子。一个有二十种颜色的Xbox镜子和一辆既轻又重的自行车

你甚至看不到红色和绿色是颜色,塑料和金属是材料

所以你必须从头开始:你真正需要什么?难道没有像“电脑”和“洗衣机”这样的产品组吗?然后,每个组都可以具有强制性属性,如计算机的cpu和洗衣机的能量等级,以及可选属性,如颜色,可以给出,但不被认为是必要的,或者计算机的屏幕,可能有,也可能没有。然后,每个产品都将属于一个产品组,您将知道可以或必须为其输入哪些属性(以及可以通过哪些属性过滤某些产品)

然后想想你有哪些特点:

  • cpu=Intel i5 | Intel i7 | AMD FX=一个cpu的可能值列表
  • 颜色=白色|黑色|……=还有一个列表,但每个产品可以有多种颜色
  • 鼠标=是|否=布尔标志
  • modelno=\uuuuuuuuu=自由文本属性
然后为这些设计一个合适的表格

如果你甚至想要像color=learning bright orange=>bright orange=>orange这样的层次属性(这样你就可以搜索所有的橙色产品,或者只搜索淡橙色产品,甚至只搜索发光的亮橙色产品),那么你也需要一些结构。但是:难道一个人不能同时寻找发光的橙色产品,或者任何浅色产品吗?那么这将不再是一个层次结构树


正如你所看到的,这一切都会变得相当复杂。想想你真正需要什么。根据需要将其复杂化,但仅限于此。

这是我面临的难题,我需要将类别分开。groups表的问题是product表中的每一行都有不同的组。为什么组需要不同?我会取消创建约束和参照的选项,如果这是阻碍您前进的原因。使您的模式灵活,并尽可能通过脚本语言(python、php等)进行删除和引用。如果我没有抓住要点,请告诉我。类别必须分开,因为每个产品都可能与之相关。@Anthony Manzo:我认为这里不需要额外的ID。你为什么认为需要它?@EternalHour:你说分类是什么意思?你有类别、产品以及两者之间的关系。你还需要什么?我不明白这个问题。首先,这不是一对多关系,而是多对多关系(产品1可以有多个类别;红色类别可以有多个产品)。你的方法看起来不错。仅使用组合主键
主键(productID,categoryID)
替换键categoryID(categoryID)、键productID(productID)。实际上,你的问题是什么?在研究了更多如何做到这一点之后,我突然想到,我需要的模型类似于一个层次结构,在MYSQL中看起来像一团乱。我会很快更新一个更清晰的解释和图表的问题。谢谢你的反馈。你帮助我认识到,我需要一个更好的结构,这将是更多的功能。我确实有产品组,这只是找到它们之间的共同关系的问题。但“锡裤子”绝对不是一个选项!