我试图找出如何为数据库中的一行正确创建多个一对多关系。
说我有产品表。
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值。
答案 0 :(得分:0)
您的示例指示第三个表,但首先您需要向category_to_product_table添加主键(* id
int(11)NOT NULL AUTO_INCREMENT)
小组的第三个表格:
CREATE TABLE category_to_product_groups
(
id
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和洗衣机的能量等级,可选的属性,如颜色可能,可以给出但不被认为是必要的,或者像计算机的屏幕,它可能具有或不。然后,每个产品都属于一个产品组,您就知道可以或必须为其输入哪些属性(以及可以过滤某些产品的属性)。
然后考虑一下你的属性:
然后考虑适当的表设计。
如果你甚至想要像color = luminous bright orange =>这样的等级属性。亮橙色=>橙色(所以人们可以搜索所有橙色产品或只是浅橙色产品,甚至只是发光的橙色产品),那么你也需要一些结构。但那么:难道不应该也能找到发光的橙色产品,或者任何浅色产品吗?那么这将不再是一个分层树。
如你所见,一切都变得相当复杂。想想你真正需要什么。根据需要使它变得复杂,但只有那么复杂。