2014-07-10 46 views
-1

我有一个MySQL数据库〜5000行。我想到在添加任何记录或列之前,我需要将数据库标准化。但即使我所做的所有研究都在努力理解几个概念。这是我现有的数据库模式的一个例子。如何正常化类别数据库

 
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 

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

编辑 另一个值得关注我,是,如果我把类别在单独的表,每个都有自己的行,我失去的结构。所以我失去了按特定类别排序的能力。例如,蔬菜类别不会与水果有关。由于Produce_String是唯一的,我可以将它用作其他表中的外键吗?

+0

如果您想了解正规数据库设计的规律,或者您想自己做,您认为这是正确的,这更多的是一个问题。学习与之相关的数据库设计和技术的规律,很早就很痛苦,但值得。您的设计目前为您提供服务,但最终在维护方面会让您付出代价。 – Edper

+0

看到正常化 – Strawberry

+0

有人请把这个问题摆脱苦难,并投票结束。 – EternalHour

回答

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); 
+0

感谢您的回答。它看起来像一个混乱的管理。我宁愿保留一个字符串作为参考,而不是将所有内容都与一个整数相关联。 – EternalHour

+0

@EternalHour不要使用字符串作为键。它会很慢。尽可能使用ID。而且您的类别名称可以随时更改,因此您必须更新所有相关表格,并将类别名称用作关键字。这不好! – Justinas

0

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

规范化通常可以解决更多的问题,而不是它造成的问题。考虑一个人在你的例子中将“Vegetable”拼写为“Vegteable”,或者考虑是否要添加第四个类别。或者,如果您想将“Baby Marrow”类别的所有实例更改为“Zuccini”,那该怎么办?你是正确的,这两个都可以作为单独的表来实现。

您可以用来决定是否正常化的标准之一是考虑要控制数据完整性的位置。您现在可能正在控制应用程序代码,确保类别名称始终保持一致,但很难预见将来会出现哪些应用程序。将类别列表保留在自己的表中可以确保将两个产品链接到同一类别时,它们确实链接到同一类别(即类别表中的单行“Vegetable”)。当你改变一个类别时,你可以在一个地方改变它。在删除类别之前,您可以轻松找到链接到单个类别的所有产品,等等。

是的,一旦数据位于不同的表格中,您不会再在一行中看到它,但是加入数据是关系数据的全部内容,您可以使用数据库视图重新创建布局你已经从底层的标准化数据向我们展示了。在SQL select语句中加入多个表是非常正常的。

+0

我绝对可以看到优势,但我关心的是可管理性。如果可能的话,我希望根据单词而不是id来保留我的查询。 – EternalHour

+0

所以你在谈论'select * from product where category1 =“Vegetable”或category2 =“Vegetable”或category3 =“Vegetable”'和'select * from product p,productCategory pc,category c where pc.forProduct = pd和pc.forCategory = c.id和c.name =“蔬菜”。你习惯了,而且有很多优点! – wwkudu

+0

想想这样,有三个类别栏,你有3个字符串管理 - 我会发现非常凌乱:) – wwkudu