将重复数据存储到数据库

时间:2015-12-06 07:57:32

标签: mysql database database-design

在一行数据库中存储重复变量的好方法是什么。

我在某些专栏中有很多重复的值,感觉有更好的方法可以做到这一点。

我想到的是像使用外键分配列并执行连接以从名为misc的表中获取其值。

以下是我的想法: enter image description here

我是否在正确的轨道上?另外,如果我这样做,我将如何得到两列的值。

我正在使用: PHP 5.5, MySQL 5.6

In"表1" PK是自动增量INT,FK将是"表2"的PK。这是misc_id

2 个答案:

答案 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
)