0

你怎么知道数据应该在一个单独的表中还是每个产品都集中到一个表中?是否有一般规则或最佳实践?

例如。

产品有名称、品牌、分类、说明、警告、推荐用途、评论、注释、限制。

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

您如何知道关系数据库是矫枉过正还是必不可少?

4

4 回答 4

5

如果您正在考虑存储任何以逗号分隔的列表,那么这是一个明确的信号,您需要将其分解到另一个表中。永远不要每列存储一个以上的值。

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

更详细地说,设计一个好的数据库模式有点像一门艺术——随着时间和经验,你会变得更好。不要太担心犯错而害怕尝试。

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

于 2012-11-03T19:05:57.487 回答
2

如果您使用逗号分隔值,那么这是将数据移动到另一个表中的好时机。

一旦您的数据被整齐地组织到包含特定类型数据的表格中,那么选择记录的事情就会变得更容易。

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

于 2012-11-03T19:05:26.883 回答
1

每当您的表中有冗余数据时,这表明您需要创建新表。在上面使用产品的示例中:

产品有名称、品牌、分类、说明、警告、推荐用途、评论、注释、限制。

分类将是您希望在另一个表中列出的明确项目。这使您的数据标准化。所以在上面的例子中,我至少有三个表,一个是品牌表,一个是分类表,一个是产品表。如果您需要多个笔记并跟踪添加笔记的不同时间,那么您可以为此创建一个表格。这使得查找数据变得容易,确保例如,如果您想要重新分类小部件组分类中的所有小部件,您只需更新分类表中的组名称,而不是产品表中的每条记录。

这是维基百科主题的链接http://en.wikipedia.org/wiki/Database_normalization

于 2012-11-03T19:31:12.950 回答
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产品。有些人会为此使用表中的类别名称的 CSV product

但是,您可能还有两个表:

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 播放器、立体声系统等的产品。

于 2012-11-03T19:31:42.480 回答