您如何知道数据是应该在单独的表中,还是每个产品都聚集在一个表中?是否有一般规则或最佳做法?
例如。
产品有名称,品牌,分类,路线,警告,推荐用途,评论,注释,限制。
我可以看到他们如何从单独的表中受益,但是在一个产品表下是否也可以使用逗号分隔的条目?
您如何知道关系数据库是否过度或必不可少?
答案 0 :(得分:5)
如果您正在考虑存储以逗号分隔的任何内容列表,那么您需要将其分解为另一个表格。永远不要为每列存储多个值。
有关数据库规范化的更多信息,请阅读此内容: http://en.wikipedia.org/wiki/Database_normalization
为了进一步阐述,设计一个好的数据库模式可能会让人感觉有点像艺术 - 有了时间和经验,你会变得更好。不要过于担心你害怕尝试做错事。
但也意识到关系数据库理论已经存在了30多年,通过学习标准的做事方式可以避免很多痛苦。
答案 1 :(得分:2)
如果你是逗号分隔值,那么现在是将数据移动到另一个表格的好时机。
将数据整齐地组织到包含特定类型数据的表中后,就可以更轻松地选择记录。
例如,标签。是的,您可以在产品表中将标签保存为CSV,但是如何获取标记为“实用程序”的所有产品?您必须选择所有记录,将标记拆分为逗号中的数组,然后遍历产品集合中的相关记录。这只是一个例子。我相信你可以看到这只会增加你存储的更多记录和更复杂的数据。
答案 2 :(得分:1)
如果您的表中有冗余数据,则表明您需要创建新表。在上面用于产品的示例中:
产品有名称,品牌,分类,方向,警告,a 推荐使用,评论,注释,限制。
分类将是您希望在另一个表中列出的明确项目。这使您的数据标准化。因此,在上面的示例中,我将至少有三个表,一个用于品牌,一个用于分类,一个用于产品。如果您需要多个音符并在添加音符时跟踪不同的时间,则可以为其创建表格。这样可以轻松查找数据,确保例如,如果要重新分类窗口小部件组分类中的所有窗口小部件,则只需更新分类表中的组名称,而不是产品表中的每个记录。
上主题的链接答案 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
所做的那样。
因此,如果warnings
,classifications
等具有非常结构化的值(或每个产品的值不止一个),那么您应该将它们放入新表中。
我不确定你打算用其他领域做些什么。因此,让我举一个常用的制作领域的具体例子。
让我们假设您要跟踪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播放器,立体声系统等的产品。