纠正多个一对多关系的架构?

时间:2014-12-01 19:10:29

标签: 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 `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将是基本级别查询,并且将包含最一般的信息,假设此类别是电子设备。

2级查询,将是稍微更精细的查询,并且将是电子设备的子类别,所以类似于电子设备 - >电视机。 将其视为面包屑。这本身似乎很难做到,但在这种情况下,产品需要能够与几个不同的相关联相同级别或不同级别。我希望这是有道理的。


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

2 个答案:

答案 0 :(得分:0)

您的示例指示第三个表,但首先您需要向category_to_product_table添加主键(* id int(11)NOT NULL AUTO_INCREMENT)

小组的第三个表格:

CREATE TABLE category_to_product_groupsid int(11)NOT NULL AUTO_INCREMENT, categoryProductGroupName varchar(40), category_to_product_id int(11)NOT NULL, )ENGINE = InnoDB DEFAULT CHARSET = utf8

第三个表每个组名称将有多个行(一个组可以只是一个或多个category_to_product行)。

答案 1 :(得分:0)

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

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

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

然后考虑一下你的属性:

  • cpu = Intel i5 | Intel i7 | AMD FX =一个cpu的可能值列表
  • color = white |黑色| ... =也是一个列表,但每个产品可以有多种颜色
  • mouse = yes | no =布尔标志
  • modelno = ____ =自由文字属性

然后考虑适当的表设计。

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

如你所见,一切都变得相当复杂。想想你真正需要什么。根据需要使它变得复杂,但只有那么复杂。