在一行数据库中存储重复变量的好方法是什么。
我在某些专栏中有很多重复的值,感觉有更好的方法可以做到这一点。
我想到的是像使用外键分配列并执行连接以从名为misc的表中获取其值。
我是否在正确的轨道上?另外,如果我这样做,我将如何得到两列的值。
我正在使用: PHP 5.5, MySQL 5.6
In"表1" PK是自动增量INT
,FK将是"表2"的PK。这是misc_id
答案 0 :(得分:1)
要获得拟议设计中两列的值,您可以执行以下查询:
SELECT cat.item, sub.item
FROM table1 prj
JOIN table2 cat ON prj.project_category = cat.misc_id
JOIN table2 sub ON prj.project_sub_category = sub.misc_id
项目类别和子类别是否可以互换?如果是这样,那么你就是在正确的轨道上,只需给这些表格命名。
如果没有,我建议你不要走那条路。不是将所有VARCHAR收集到一个表中,而是使用单独的表来描述不同的值集:
project (project_category PK/FK, project_sub_category PK/FK)
project_category (project_category PK, category_name VARCHAR)
project_sub_category (project_sub_category PK, sub_category_name VARCHAR)
然后您可以使用以下方式查询:
SELECT cat.category_name, sub.sub_category_name
FROM project prj
JOIN project_category cat ON prj.project_category = cat.project_category
JOIN project_sub_category sub ON prj.project_sub_category = sub.project_sub_category
因此,查询的结构不会发生太大变化,但区分类别和子类别的优势在于,您将来能够添加不同的属性,关系和约束。 / p>
更强大(和复杂)的安排是将类别和子类别建模为层次结构。从类似于表2的类别表开始,可以添加:
sub_category (main_category PK/FK, sub_category PK/FK)
也称为父/子表。在此设计中,您只会记录每个项目的最具体类别。当我们想要找到给定父级的后代时,会增加复杂性,其中有closure tables等技术。
答案 1 :(得分:0)
尝试使用子查询。
SELECT project_id, project_category, project_sub_category,
(SELECT item FROM misc WHERE project_category = misc_id) AS cat,
(SELECT item FROM misc WHERE project_sub_category = misc_id) AS sub
FROM projects
WHERE project_id = 4
这是我得到的数组:
Array
(
[project_id] => 4
[project_category] => 1
[project_sub_category] => 2
[cat] => IT & Development
[sub] => Mobile Software Development
)