我正在学习如何以专业人士的方式设计表格,但我不确定这是否正确。
我有一个表,我在id中存储了一个主ID,而parent_id引用了父,同样在同一个表中
表格结构
CREATE TABLE IF NOT EXISTS `catalog` ( `id` int(3) NOT NULL AUTO_INCREMENT, `p_name` longtext NOT NULL, `p_code` varchar(255) NOT NULL, `p_brand` varchar(255) NOT NULL, `p_version` varchar(5) NOT NULL, `parent_id` varchar(255) NOT NULL, PRIMARY KEY (`search_id`) ) ENGINE=MyISAM DEFAULT; +--------+----------+----------+----------+-----------+-----------+ | id | p_name | p_code | P_brand | p_version| parent_id | +--------+----------+----------+----------+-----------+-----------+ | 1 | Alpha | S001 | X | 1 | 6 | | 2 | Alpha | S032 | X | 2 | 6 | | 3 | Alpha | S403 | X | 3 | 6 | | 6 | Prism | S004 | | 1 | | | 6 | Prism | S044 | | 2 | | +--------+----------+----------+----------+-----------+ ----------+
我已经研究过数据透视表,但它不符合我想要实现的目标。
我希望生成一个报告,显示每个ID的版本,而不使用查找表。
+--------+----------+----------+----------+-----------+-----------+ | id | p_name | version 1| version 2| version 3 | parent_id| +--------+----------+----------+----------+-----------+-----------+ | 1 | Alpha | S001 | S032 | S43 1 | 6 | +--------+----------+----------+----------+-----------+ ----------+
答案 0 :(得分:0)
你在这里建议的结构是一个像数据结构一样的“树”,其概念是所有东西都存在于从父母到孩子的heirarcheal数据模型中。
想想只在一个地方拥有数据。例如,如果字符串“S001”将由多个记录使用,然后创建基于星形的模式或甚至更复杂的雪花模式将是更好的选择。
答案 1 :(得分:0)
由于p_name,p_brand和p_parent_id对于每个版本都是通用的,因此您应该将表格拆分为三个 -
products (id, name, brand_id, parent_id)
versions (id, product_id, code, version)
brands (id, brand).
根据目录表的当前结构,您可以使用这样的交叉表查询 -
SELECT
`p_name`,
MAX(IF(`p_version` = 1, `p_code`)) AS `version 1`,
MAX(IF(`p_version` = 2, `p_code`)) AS `version 2`,
MAX(IF(`p_version` = 3, `p_code`)) AS `version 3`,
`parent_id`
FROM `catalog`
GROUP BY `p_name`, `parent_id`
如果你使用我建议的表格结构,这将改为像这样 -
SELECT
`p`.`name`,
MAX(IF(`v`.`version` = 1, `v`.`code`)) AS `version 1`,
MAX(IF(`v`.`version` = 2, `v`.`code`)) AS `version 2`,
MAX(IF(`v`.`version` = 3, `v`.`code`)) AS `version 3`,
`p`.`parent_id`
FROM `products` `p`
INNER JOIN `brands` `b`
ON `p`.brand_id` = `b`.`id`
INNER JOIN `versions` `v`
ON `p`.`id` = `v`.`product_id`
GROUP BY `p`.`name`, `p`.`parent_id`