数据库结构 - 我怎么知道我需要多个表

时间:2012-11-03 19:00:38

标签: mysql database database-design

您如何知道数据是应该在单独的表中,还是每个产品都聚集在一个表中?是否有一般规则或最佳做法?

例如。

产品有名称,品牌,分类,路线,警告,推荐用途,评论,注释,限制。

我可以看到他们如何从单独的表中受益,但是在一个产品表下是否也可以使用逗号分隔的条目?

您如何知道关系数据库是否过度或必不可少?

4 个答案:

答案 0 :(得分:5)

如果您正在考虑存储以逗号分隔的任何内容列表,那么您需要将其分解为另一个表格。永远不要为每列存储多个值。

有关数据库规范化的更多信息,请阅读此内容: http://en.wikipedia.org/wiki/Database_normalization

为了进一步阐述,设计一个好的数据库模式可能会让人感觉有点像艺术 - 有了时间和经验,你会变得更好。不要过于担心你害怕尝试做错事。

但也意识到关系数据库理论已经存在了30多年,通过学习标准的做事方式可以避免很多痛苦。

答案 1 :(得分:2)

如果你是逗号分隔值,那么现在是将数据移动到另一个表格的好时机。

将数据整齐地组织到包含特定类型数据的表中后,就可以更轻松地选择记录。

例如,标签。是的,您可以在产品表中将标签保存为CSV,但是如何获取标记为“实用程序”的所有产品?您必须选择所有记录,将标记拆分为逗号中的数组,然后遍历产品集合中的相关记录。这只是一个例子。我相信你可以看到这只会增加你存储的更多记录和更复杂的数据。

答案 2 :(得分:1)

如果您的表中有冗余数据,则表明您需要创建新表。在上面用于产品的示例中:

  

产品有名称,品牌,分类,方向,警告,a   推荐使用,评论,注释,限制。

分类将是您希望在另一个表中列出的明确项目。这使您的数据标准化。因此,在上面的示例中,我将至少有三个表,一个用于品牌,一个用于分类,一个用于产品。如果您需要多个音符并在添加音符时跟踪不同的时间,则可以为其创建表格。这样可以轻松查找数据,确保例如,如果要重新分类窗口小部件组分类中的所有窗口小部件,则只需更新分类表中的组名称,而不是产品表中的每个记录。

以下是维基百科http://en.wikipedia.org/wiki/Database_normalization

上主题的链接

答案 3 :(得分:1)

听起来您想知道每个产品是否需要不同的表格。这绝对不是数据库规范化的工作原理。

您希望根据表的类型(在数据库世界中称为“实体”)来分隔表。

你的例子似乎相当微不足道。我不确定您计划使用CSV的位置。但是,我不确定这些字段中的某些字段是否具有非常结构化的值(什么构成“分类”或“警告”?)。

但无论如何,一个简单的例子:

CREATE TABLE brand (
    brand_id INT PRIMARY KEY,
    brand_name VARCHAR(100)
);

CREATE TABLE product (
    product_id INT PRIMARY KEY,
    brand_id INT,
    classifications VARCHAR(200),
    directions VARCHAR(200), 
    warnings VARCHAR(200), 
    recommended_use VARCHAR(200),
    comments VARCHAR(200),
    notes VARCHAR(200),
    restrictions VARCHAR(200)
);

然后,如果您想查询所有 Sony 产品,请执行以下操作:

SELECT * 
FROM product
JOIN brand
USING (brand_id)
WHERE brand_name = 'Sony';

如果product表格中的某些其他字段更具结构性,您可能希望将其拆分出来,就像您对brand所做的那样。

因此,如果warningsclassifications等具有非常结构化的值(或每个产品的值不止一个),那么您应该将它们放入新表中。

我不确定你打算用其他领域做些什么。因此,让我举一个常用的制作领域的具体例子。

让我们假设您要跟踪category个产品。有些人会在product表中使用类别名称的CSV。

但是,您可以再增加两个表:

CREATE TABLE category (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(100)
);

CREATE TABLE product_category (
    product_id INT,
    category_id INT,
    PRIMARY KEY(product_id, category_id)
);

因此,通过在product_category表中添加多个条目,产品可以有多个类别。

因此,如果您要搜索Sony Electronics

SELECT product.* 
FROM product
JOIN brand
USING (brand_id)
JOIN product_category
USING (product_id)
JOIN category
USING (category_id)
WHERE brand_name = 'Sony'
AND category_name = 'Electronics';

这将返回可能是电视,DVD播放器,立体声系统等的产品。