我应该避免数据库中的重复条目吗?

时间:2016-07-26 14:25:47

标签: mysql database database-design

从设计的角度来看,我想知道基本上一个有2个字段(id,name)的表是否应该有名称的副本。我正在设计一个数据库,其中包含一个名为projects(pro_id,pro_name)的表和一个名为categories(cat_id,cat_name)的表。项目名称肯定是独一无二的。给定项目可能有许多与之关联的类别,并且将有第三个表名为procat(procat_id,pro_id,cat_id)来执行此操作。问题是,可能有几个项目具有相同名称的类别。因此,项目1和7可能都有一个名为“浴室”的类别。我的问题是,我的类别表是否只反映“浴室”的1个条目或2个具有2个ID的单独条目?请注意,这些类别及其在数据库中的作用将彼此不同。 Project 1的浴室可能有​​一组与之相关的数据(颜色=蓝色,尺寸= 400等),而Proect 7的浴室可能有​​不同的数据(所有数据都记录在不同的表格中)。

感谢您的帮助!目前我倾向于在类别表中重复条目,但我想确保我没有遗漏会在以后引起问题的东西。

4 个答案:

答案 0 :(得分:1)

值是否在列中重复取决于表中的行是什么意思以及根据业务规则可能产生的表值。例如:假设你决定某种东西在某种东西中有自己唯一的id。然后,ids在一个表中是唯一的,该表对于具有给定属性的每个事物都有一行。但假设表中的行包含id&将“东西ID以彩色颜色变为彩色”的颜色值转换为真实的陈述。然后,如果事物只有一种颜色,那么颜色将是唯一的,但如果事物可以有多种颜色,那么列颜色将不是唯一的。虽然id​​-color对是唯一的。

您作为DBA必须为每个表确定这样的含义或谓词,以确定在给定情况下表的行。即由列参数化的语句模板,其中表包含使模板成为真实语句的行。

您的表集必须具有足够的谓词,以便能够描述出现的任何情况,而您不希望表或表中的行声明相同的事情。通过学习和确定良好的设计;应用信息建模方法&正常化。

  

问题是,可能有几个项目具有相同名称的类别。

确保明确区分两个不同的概念,并且不要同时调用“类别”:在自己的项目中单独存在的东西(这是你在引用中使用“类别”的方式)与其中一个的,具有自己的属性,如名称,多个项目可能相关联,但在项目类型的基础上与其他属性相关联。您似乎选择了“类别”这个词作为类型的同义词(因为部门),所以这可能就是您的意思。即有一个类型/类别的房间名为“浴室”,不同的项目相同种类/类别的房间但不同的项目类型/类别对,即房间在世界各地,有不同的属性和&同一财产的不同价值。

  

我的问题是,我的类别表是否只反映“浴室”的1个条目或2个具有2个ID的单独条目?

假设您有独特的类别&项目ID。考虑表c(id, name),其中谓词“类别ID由名称NAME调用”。如果某个类别与只有一个名称相关联,则id将是唯一的。否则,事物可以与多个名称相关联,因此id - name子行将是唯一的。您已经说过不同的类别可以具有相同的名称。另一方面,从你所说的pc表(pid,cid,name)“项目PID类别CID被名称CNAME调用”然后由于项目不共享类别CID是唯一的,尽管PID不是。请注意,在这种情况下,c的谓词“类别ID由名称NAME调用”也表示“对于某些项目PID,在项目PID类别中,CID由名称NAME调用”。所以c只是select cid as id from pc。因此,如果您有c,则不需要pc

另一方面,如果您确定类别ID不是唯一的,而是类别由项目类别ID对唯一标识,则c name中的类别不会是唯一的{{1 }} cp - PID对将是唯一的CID& CID不会。

答案 1 :(得分:0)

我目前看到两种可能性:

可能性1:立即在类别数据集中包含详细信息。这使得保留所有重复名称是合理的,因为它们在这里被区分。

可能性二:除了类别中的名称之外,不要包含任何细节,因为您目前拥有它并将它们组合在一起。如果这个ID只是作为一个名称,你有其他因素要排序(例如,通过项目ID识别一个浴室项目),那么你应该将它们组合起来。如果你不这样做,你可能会遇到扩展问题,因为你耗尽了太多不必要的空间。

答案 2 :(得分:0)

您的类别表每个类别只需要一个条目

"浴室和#34;之间的任何差异在Categories表中实际应该存储在Projects表中,因为它们特定于Project而不是特定于Category。所有这些都应存储在"浴室"在“类别”表中,所有浴室都有共同的信息。

在关系数据库中,目标是找到类似的实体并将它们分组到表中。例如," Projects"和"类别"是不同的实体,您已正确将它们放入单独的表中。然后,这些表格的行代表不同类型的这些实体("卧室","壁橱"等),并且因为改变了"浴室&#34的颜色或大小;不会更改其类别",该信息应存储在其他地方。在您的情况下,这可能是Projects表。

答案 3 :(得分:0)

不清楚要问,但我希望这可能会以某种方式帮助你:

记住:

您不需要检查pro_name的副本,但是,如果您的ID字段是重复的(有时在手动尝试插入时会发生)并且标识未设置为列。因此,始终将一个表ID分配给Identity列,以使每个字段唯一自动编号并删除重复插入。

回答你的问题:

Q值。我的问题是我的类别表是否只反映了#34;浴室"还是2个带有2个ID的单独条目?

ANS:不,因为你以后可能会有类似或相同的名字(例如:"浴室"),因为两个表格都设置为自动识别而不是重复你就可以了。

示例:

pro_id=1, pro_name="bathroom"
pro_id=2, pro_name="bathroom"
pro_id=3, pro_name="bathroom"
pro_id=4, pro_name="bathroom"

但是如果你的表是这样的话会重复,而且没有人想要这个:

pro_id=1, pro_name="bathroom"
pro_id=1, pro_name="bathroom"
pro_id=2, pro_name="bathroom"
pro_id=2, pro_name="bathroom"

请注意: 我在这里做的是项目(pro_id,pro_name)和类别(cat_id,cat_name) 我在类别上创建pro_id并链接外键这是因为你说 "给定项目可能有许多与之关联的类别"。 在此之后你甚至可能不需要第三张桌子。