问题标签 [database-normalization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
10 回答
84639 浏览

database - 在数据库列中存储分隔列表真的那么糟糕吗?

想象一个带有一组复选框的 Web 表单(可以选择其中任何一个或全部)。我选择将它们保存在一个逗号分隔的值列表中,该列表存储在数据库表的一列中。

现在,我知道正确的解决方案是创建第二个表并正确规范化数据库。实施简单的解决方案更快,我希望快速获得该应用程序的概念验证,而不必花费太多时间。

我认为在我的情况下节省的时间和更简单的代码是值得的,这是一个合理的设计选择,还是我应该从一开始就对其进行规范化?

更多上下文,这是一个小型内部应用程序,它基本上替换了存储在共享文件夹中的 Excel 文件。我也在问,因为我正在考虑清理程序并使其更易于维护。里面有些东西我并不完全满意,其中之一就是这个问题的主题。

0 投票
11 回答
686 浏览

mysql - 不必要的标准化

我和我的朋友正在建立一个网站,但存在重大分歧。该网站的核心是一个关于“人”的评论数据库。基本上人们可以输入评论,他们可以输入评论的人。然后,查看者可以在数据库中搜索评论中的单词或人名的一部分。它完全是用户生成的。例如,如果有人想对拼写错误的人名发表评论,他们可以,这没关系。所以可能有不同人的多种拼写被列为几个不同的条目(一些带有中间名,一些带有昵称,一些拼写错误等),但这一切都可以。我们不在乎人们是否对随机的人或虚构的人发表评论。

无论如何,问题在于我们如何构建数据库。现在它只是一个以评论 ID 作为主键的表,然后有一个字段用于评论的“人”:

评论 ID - 评论 - 人

1 - “他很奇怪” - 约翰史密斯

2 - “臭女孩” - 珍妮

3 - “同性恋” - 约翰史密斯

4 - “欠我 20 美元” - Jennyyyyyyyyy

一切正常。使用数据库,我能够创建列出特定“人”的所有“评论”的页面。然而,他对数据库没有规范化很着迷。我阅读了规范化并得知他错了。该表目前已规范化,因为评论 ID 是唯一的,并且规定了“评论”和“人”。现在他坚持“人”应该拥有它的 OWN 表,因为它是一个“事物”。我认为没有必要,因为即使“人”确实是更大的容器(一个“人”可以有很多关于他们的“评论”),数据库似乎运行得很好,“人”是评论 ID。我对不同的 SQL 选择使用各种 PHP 调用,以使其在输出和用户搜索和查看结果的不同方式上神奇地显得更加复杂,但实际上,设置非常简单。我现在让用户用竖起大拇指和不喜欢的方式对评论进行排名,并且我在同一张桌子上保留一个“分数”作为另一个字段。

我觉得目前没有必要为唯一的“人”条目设置单独的表格,因为“人”没有自己的“分数”或任何自己的属性。只有评论可以。我的朋友是如此坚持,以至于它是提高效率的必要条件。最后我说,“好吧,如果你要我创建一个单独的表,让'person'作为它自己的字段,那么第二个字段会是什么?因为如果一个表只有一个列,这似乎没有意义。我同意我们可能会在以后创建一个需要给“人”它自己的桌子,但我们可以处理那个。” 然后他说字符串不能是主键,我们将当前表中的“人”转换为数字,数字将成为新“人”表中的主键。对我来说,这似乎没有必要,它会使当前表格更难阅读。他还认为以后创建第二个表是不可能的,我们现在需要预测我们以后可能需要它来做一些事情。

谁是对的?

0 投票
7 回答
2192 浏览

mysql - 在一个非常简单的数据库中,数据库规范化有多重要?

我正在制作一个非常简单的数据库(mysql),其中包含两种类型的数据,始终具有 1 对 1 的关系:

活动

  • 赞助
  • 时间(可选)
  • 位置(城市,州)
  • 场地(可选)
  • 详细信息网址

赞助商

  • 姓名
  • 网址


城市会经常被复制,但是对于这样一个简单的数据库模式来说,拥有一个城市表真的有很大的价值吗?

该数据库是通过对网站进行屏幕抓取来填充的。在这个站点上,城市字段是通过从下拉列表中选择来填充的,因此不会出现输入错误等情况,并且很容易将记录与城市表匹配。即使我的数据库的用户会经常按城市搜索,我也不确定是否会有很大的意义。

0 投票
4 回答
401 浏览

sql-server - 千行的最佳数据库设计是什么

我即将开始一个数据库设计,它将简单地管理公司下的用户。

  • 每个公司都会有一个可以管理用户的管理区域
  • 每家公司将拥有大约 25.000 名用户
  • 客户认为有大约 50 家公司开始

我的主要问题是

我应该根据公司创建表吗?像

users_company_0001 users_company_0002 users_company_0003...

因为每家公司都不会使用“其他”用户,并且不需要对所有 user_company 中的不同表进行求和/计数(一个简单的方法JOIN就可以了,尽管它更昂贵(时间)它将作为主要图片工作,这永远不会被需要。

或者我应该创建一个users表来拥有 (50 x 25000) 1 250 000 个用户(并且还在增长)。

不过,我正在考虑第一个选项,但我不确定如何在这种布局上使用实体框架......我可能需要回到 90 年代并手动生成我的数据逻辑层。

是否会是对包含公司 ID 的存储过程的简单调用

你会建议什么?

系统应用程序将是ASP.NET(可能是 MVC,我仍在尝试解决这个问题,因为我所有的知识都在网络表单上,虽然我看过 Scott Hanselman MVC 视频 - 接缝很容易 - 但我知道它不会那么容易问题会来的,我会花更多时间来解决它们),以及Microsoft SQL

0 投票
2 回答
2323 浏览

oracle - 规范化表:在一系列行中查找唯一列 (Oracle 10.x)

我有一个具有以下结构的表:

如您所见,它是一张非规范化表,在一张表中同时保存了 Worker 和 Person(以及一个 Person 的多个版本)数据。我的愿望是规范化该表,但是,由于该表包含大量数据(很多列),我需要确定哪些列应该进入 Workers 表,哪些列应该进入 Persons 表。结果应该是这样的:

为此,我需要分析所有唯一人员(在 WorkerPersons 中由 PersonID 分隔)的 Person 范围内哪些数据不同。例如:

在这种情况下,PersonA 上有 3 个版本,PersonB 有 2 个版本。Column1 的值在所有版本的 Person 中始终相同,我们可以将该列移动到表 Worker。但是 Column 2 和 Column3 的值会随着 Person 的不同版本而变化,因此应该将这些值移动到 Person 表中。

没想到,我有大约 10 个这样的表需要标准化,每个表大约有 40 列。每个表包含大约 500k 到 5m 行。

我需要一个脚本来帮助我分析哪些列要移动到哪里。我需要一个脚本来输出在整个表中唯一 Person 范围内发生变化的所有列。我不知道如何做到这一点。我尝试了 LAG 分析函数来与下一行进行比较,但是如何输出更改的列却超出了我的范围。

请指教。

最好的祝愿,安德鲁

0 投票
3 回答
598 浏览

database - 什么是数据规范化?

可能重复:
数据库规范化到底是做什么的?

有人可以澄清数据规范化吗?有哪些不同的层次?我什么时候应该“去规范化”?我可以过度正常化吗?我有一张包含数百万条记录的表,我相信我对其进行了过度规范化,但我不确定。

0 投票
1 回答
1755 浏览

database - Database Normalization examples

I am looking forward to learn database normalization with help of some examples.
Putting it simple - How can I make someone learn about Normal forms giving examples.

I looked for some articles online, but did not find them very useful

0 投票
6 回答
59731 浏览

database - 功能依赖和规范化

我正在尝试寻找一个很好的资源来研究功能依赖性和规范化。

有人知道我应该去哪里看吗?我很难区分 FD 是 1NF、2NF 还是 3NF?

我一直在阅读维基百科并使用谷歌搜索来找到很好的研究,但找不到任何简单的解释。

也许你们都可以分享你在生活中是如何学习 FD 和正常化的。

0 投票
5 回答
5453 浏览

sql - 关系数据库设计(规范化多对多映射)

以下是我面临的设计问题的类似(和简化)示例:

假设您有学生、班级和成绩。学生可以在许多不同的班级。每个班级有许多不同的学生。每个(学生,班级)对都有一个等级。

我应该像这样布局数据库(mysql数据库):

选项1)

选项 2)

还是应该将其设计为其他东西?选项 2 现在看起来更简单了,但在未来,我可能需要与每个 (student_id,class_id) 对相关的其他统计信息(在这种情况下,选项 1 似乎更好一些?选项 1 仍然感觉有点过于复杂)。

你有什么建议吗?谢谢。

0 投票
1 回答
499 浏览

relational-database - 这张桌子是 2NF 的吗?

在尝试了解数据库规范化时,我对下表感到困惑:

我正在使用的书将此作为 1NF 中的表的示例。但是,在阅读了关于 1NF、2NF 和 3NF 的 Wikipedia 文章后,我有点困惑。

据我所知,这个表有两个候选键:{Name,Organisms} 和 {Date,Organisms}。根据维基百科(链接文本):

一个 1NF 表在 2NF 中当且仅当它的所有非主属性在功能上依赖于每个候选键的整体。(非主属性是不属于任何候选键的属性。)

根据“非主属性”的这个定义,在我看来,这个表没有非主属性,因为每个字段至少属于两个候选键中的一个。如果没有非主要属性,那么(因为该表在 1NF 中)根据维基百科的定义,该表似乎在 2NF 中。

但是,我认识到这个表设计得很糟糕并且容易出现更新错误,所以我认为我一定是在某个地方出现了逻辑错误。 如果有人能解释这张表是哪种范式和/或我的推理在哪里有问题,我将不胜感激。