如何规范化类别数据库

时间:2014-07-10 08:33:24

标签: mysql sql database

我有一个大约5000行的MySQL数据库。我想到,在添加任何记录或列之前,我需要对数据库进行规范化。但即使我完成了所有的研究,我也在努力理解几个概念。以下是我现有数据库架构的示例。

PK Category1 Category2 Category3 Produce_String   Keywords       Zip State City Country
1  Vegetable Potato              f5kkfid34fbn     organic        ... ..... ...  .....
2  Vegetable Potato              plf85jfuvj       organic,fresh  ... ..... ...  .....
3  Vegetable Cherry    Tomato    jf9vmu37jg9      fresh        
4  Fruit     Lemon               kfkt8hkf0e       fresh,yellow
5  Fruit     Lemon               fkg8rr03gnf       
6  Fruit     Red       Apple     fkf9gkty367r6    crispy 

我的主要误解是,一旦列被分成单独的表,如何将数据相互关联?例如,在DB客户端中,我可以看到行以及它们如何相互关联,但如果我将它们分开,则不再是这种情况。我也担心必须更新同一记录的多个表,但我想这是不可避免的。 另外,我还不清楚正确化这个的正确方法。我的想法告诉我只关注关键字列,因为它是唯一具有逗号分隔条目的列。但按照标准化标准,我认为我需要将类别,关键字和位置分开。

修改 我所关心的另一个问题是,如果我将类别放在一个单独的表中,每个表都有自己的行,我就失去了结构。所以我失去了按特定类别排序的能力。例如,蔬菜类别与水果无关。由于Produce_String是唯一的,我可以将它用作其他表中的外键吗?

2 个答案:

答案 0 :(得分:0)

您可以拥有单独的CategoryKeywords表格

category                           keyword
-------------------------          -------------------------
    id      | name                     id    | name
     1      | Vegetable                 1    | organic
     2      | Potato                    2    | fresh

MANY TO MANY关系增加两个表:

category_to_product                keyword_to_product
-------------------------          -------------------------
category_id | product_id           keyword_id | product_id
     1      |     1                    1      |     1
     1      |     2                    1      |     2
     2      |     1                    2      |     2    

并更新产品#1的类别:

DELETE * FROM `category_to_product` WHERE `product_id` = :product_id;
INSERT INTO `category_to_product` (`category_id`, `product_id`) VALUES (1, 1), (2, 1), (8, 1);

答案 1 :(得分:0)

这是一个可能很长的答案的问题,你可能最好从wikipedia或类似的地方开始。但简而言之:

归一化通常可以解决比它导致的更多问题。考虑为您的示例中的某一行拼写“蔬菜”为“Vegteable”的人,或者考虑是否要添加第四个类别。或者,如果您想将“Baby Marrow”类别的所有实例更改为“Zuccini”,那该怎么办?你是对的,这两个都可以作为单独的表来实现。

您可以用来决定是否规范化的标准之一是考虑您希望控制数据完整性的位置。您现在可以控制应用程序代码,确保始终使用类别名称,但很难预见将来会有哪些应用程序。将类别列表保存在自己的表中可确保当您将两个产品链接到同一类别时,它们确实链接到同一类别(即类别表中的单行“蔬菜”)。更改类别时,可以在一个位置更改它。在删除类别之前,您可以轻松找到链接到单个类别的所有产品,依此类推。

是的,一旦数据在单独的表中,您不再在一行中看到它,但是加入数据是关系数据的全部内容,您可以使用数据库视图重新创建布局您已从基础标准化数据中向我们展示。在SQL select语句中连接多个表是很正常的。