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

问题描述:

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

感谢您的帮助!目前我倾向于在类别表格中重复输入,但我想确保我不会遗漏稍后会导致问题的内容。

+0

您是否想要显示某个类别中的所有项目?如果是这样,你应该避免有愚蠢的,这使得后来更容易查询,也给你“正常化”的数据。 https://en.wikipedia.org/wiki/Database_normalization – naththedeveloper

+1

在英语中,我们是否有单独的卫生间字样的单个副本供每个单独的浴室使用?不,我们结合在一起:项目1的浴室是蓝色的。你可以在数据库中做同样的事情,例如(pro_id PK,cat_id PK,颜色)。事实上,将谓词与每个表相关联是一种很好的做法。 – reaanb

值是否在列中重复取决于表中的行的含义以及根据业务规则可能产生的表值。例如:假设你决定在某种事情中,某种事物都有自己独特的身份。然后,ids将在一个表中具有唯一性,该表对于每个具有给定属性的事物都有一行。但是,假设表中的行包含使“东西ID以彩色着色”的颜色值成为真正的语句的ID &。如果事物只有一种颜色,那么颜色将是唯一的,但如果事情可能以多种颜色出现,那么列颜色将不是唯一的。尽管id颜色对将是唯一的。

作为DBA必须为这样的含义做出决定,或者对于在给定情况下确定表格行的每个表的谓词。即一个由列参数化的语句模板,其中该表包含使模板成为真实语句的行。

您的表的集合必须有足够的谓词才能描述出现的任何情况,而您不希望表中的行表示同一事物。通过学习&应用信息建模方法&规范化确定好的设计。

事情是,可能有几个项目具有同名的类别。

确保您清楚地分开两个不同的概念,并没有通话双方THM的“类别”:在自己的项目,单独存在(这是你如何使用在报价“类别”)对一个事这是一个其中一个,它有自己的属性如名称,多个项目可能有相同的类型,但与其他属性在项目类基础上。看起来你选择了“类别”这个词作为这个同义词(因为是部门)所以也许这就是你的意思。即有房间名为“卫生间”,不同的项目有同类/房间,但不同的项目类/对,即房间在世界各地,有不同的套属性&对于同一财产的不同值。

我的问题是我的分类表应该只反映1个“浴室”项目还是2个单独的项目与2个ID?

假设您有唯一的类别&项目ID。考虑表格c(id, name),谓词“类别ID由名称名称调用”。如果一个类别是与一个名称关联的事物,则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对唯一标识,然后在cname不会是唯一的,在cpPID - CID双将是独一无二的,但CID & PID不会。

+0

我相信我明白你在做什么。我应该有两个表:项目(p_id,p_name)和类别(c_id,p_id,c_name)。我不一定会在数据库中存储各种名称(因为可能会存储所有英文单词)。我的分类名称只是作为最终用户的友好标识符。在我的规则中,可以有几个“卫生间”的名字,但是如果他们在不同的项目中,他们都是不同的。然后,我只需在类别表中的所有3个字段上添加一个UNIQUE约束,对吧?以确保用户不会在1个项目中创建2个同名的猫。 – Joe

+0

@Joe在您建议的表格中,为确保每个项目的名称是唯一的,您将在(p_id,c_name)上创建唯一约束。如果你包含c_id(假设它是一个键),它将不起作用。 – reaanb

+0

@philipxy如果事物只有一种颜色,那么* id *将是唯一的,但如果事情可能以多种颜色出现,则列* id *将不会是唯一的。 – reaanb

我目前看到两种可能性:

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

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

你的分类表只需要为每个类别

在分类表“浴室”有区别,实际上应该被存储在项目表条目,因为它们是具体到一个项目,而不是具体到一个类别。所有关于“浴室”应该存储在类别表中的信息都是所有浴室共同的信息。

在关系数据库中,目标是找到相似的实体并将它们分组到表中。例如,“项目”和“类别”是不同的实体,并且您已将它们正确放置到单独的表格中。这些表格的行代表这些实体的不同类型(“卧室”,“衣柜”)等,并且由于改变“浴室”的颜色或大小不会改变其“类别”,该信息应该存储在别处。就你而言,这可能是项目表。

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

记住:

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

回答你的问题:

问:我的问题是应我的类别表反映了“浴室”,或者2个IDS 2个独立的项目只有1项?因为你以后可能会有类似或相同的名字(比如:“bathroom”),因为这两个表的id都设置为自动识别而不是重复的,你就好了。

例如:

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并链接外键这是因为您说 “给定的项目可能有多个与其关联的类别”。在这之后你甚至可能不需要第三张桌子。