我理解数据库规范化的概念,但总是很难用简单的英语解释它 - 特别是对于求职面试.我已阅读维基百科帖子,但仍然觉得很难向非开发人员解释这个概念."以不会获得重复数据的方式设计数据库"是首先想到的.
有没有人用简单的英语解释数据库规范化的概念?有什么好的例子可以显示第一,第二和第三范式之间的差异?
假设你去面试并且这个人问: 解释规范化的概念以及如何设计规范化的数据库.
面试官在寻找什么关键点?
有人可以向我解释3NF和BCNF之间的区别吗?如果您还可以提供一些示例,那就太棒了.谢谢.
database-design relational-database 3nf database-normalization bcnf
苦苦挣扎,看看他们之间的差异.我知道我们说2NF是"全键"而3NF"只不过是关键".
Smashery参考了这个伟大的答案:数据库设计中的1NF,2NF和3NF是什么?
用于3NF的示例与2NF完全相同 - 它是一个仅依赖于一个键属性的字段.3NF的例子与2NF的例子有何不同?
谢谢
什么是KISS(保持简单,愚蠢)的方式来记住Boyce-Codd的正常形式是什么以及如何采用非标准化的表格和BCNF呢?
维基百科的信息:对我来说不是很有帮助.
我很难确定何时关系是Boyce-Codd Normal Form,以及如果不将其分解为BCNF.鉴于这个例子:
具有功能依赖性的R(A,C,B,D,E):A - > B,C - > D.
我怎么去分解它?
我采取的步骤是:
A+ = AB
C+ = CD
R1 = A+ = **AB**
R2 = ACDE (since elements of C+ still exist, continue decomposing)
R3 = C+ = **CD**
Run Code Online (Sandbox Code Playgroud)
R4 = ACE(此关系中没有FD闭包)
所以现在我知道ACE将构成整个关系,但分解的答案是:AB,CD,ACE.
我想我正在努力解决如何将关系正确地分解为BCNF形式以及如何判断你何时完成.非常感谢任何能够在解决这些问题时让我完成思考过程的人.谢谢!
我在这里读到了关于5NF,EAV和6NF的讨论,以及需要一个目录来"自动"处理元数据和复杂的SQL.这是如何在实践中实施的?
PerformanceDBA在提到目录的6NF和EAV上写了几个答案,例如在以下问题中:
特别是多个固定表与灵活的抽象表,PerformanceDBA写的
"例如,对于6NF数据库与目录,我有一组特效,将[重新]产生执行所有根据需要选择SQL,我提供5NF为所有用户意见,所以他们不需要知道或了解的基础6NF结构.它们被驱逐出目录.因此变化很容易并且自动化.由于缺少目录,EAV类型手动完成."
sql database-design schema-design entity-attribute-value database-normalization
更新:现在可以通过JSON_TABLE函数在MySQL 8中实现:https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
我喜欢MySQL 5.7中的新JSON函数,但是试图将JSON中的值合并到一个普通的表结构中.
从中获取JSON,操作和提取数组等很简单.一路JSON_EXTRACT.但是从JSON数组到行的逆转呢?也许我对现有的MySQL JSON功能非常密切,但我还是无法解决这个问题.
例如,假设我有一个JSON数组,并希望为数组中的每个元素插入一行及其值?我找到的唯一方法是编写一堆JSON_EXTRACT(...'$ [0]')JSON_EXTRACT(...'$ [1]')等并将它们组合在一起.
或者,说我有一个JSON数组,并希望GROUP_CONCAT()它到一个逗号分隔的字符串?
换句话说,我知道我可以这样做:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, CONCAT('$[', x.n, ']'))) AS val
FROM
(
SELECT 0 AS n
UNION
SELECT 1 AS n
UNION
SELECT 2 AS n
UNION
SELECT 3 AS n
UNION
SELECT 4 AS n
UNION
SELECT 5 AS n
) x
WHERE x.n < JSON_LENGTH(@j);
Run Code Online (Sandbox Code Playgroud)
但这伤害了我的眼睛.而我的心.
我该怎么做:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, '$[ * ]'))
Run Code Online (Sandbox Code Playgroud)
...并将它与数组中的值和JSON数组本身连接在一起?
我想我在这里寻找的是某种JSON_SPLIT:
SET …Run Code Online (Sandbox Code Playgroud) 我有一个同事正在计划一个新应用程序的数据库,该应用程序将包含多个表,每个表包含30多个字段.这太过分吗?也许我只是不够了解企业.
编辑:此外,很多字段都是选项类型的东西(比如在请求表单上,你希望你的小部件是黄色还是绿色,他有一个带有枚举的'color'字段).随着时间的推移,很可能会添加或删除这些内容.我没有真正完成数据库设计,并试图远离它自己,所以也许我是完全愚蠢的,但肯定有更好的方法这样做?
我有这些表:
Projects(projectID, CreatedByID)
Employees(empID,depID)
Departments(depID,OfficeID)
Offices(officeID)
Run Code Online (Sandbox Code Playgroud)
CreatedByID是一个外键的Employees.我有一个几乎每个页面加载运行的查询.
添加冗余OfficeID列Projects以消除三个连接是不好的做法吗?或者我应该做以下事情:
SELECT *
FROM Projects P
JOIN Employees E ON P.CreatedBY = E.EmpID
JOIN Departments D ON E.DepID = D.DepID
JOIN Offices O ON D.officeID = O.officeID
WHERE O.officeID = @SomeOfficeID
Run Code Online (Sandbox Code Playgroud)
在应用程序编程中,我"首先编写最佳实践并在之后进行优化",但数据库管理员始终警告连接的成本.
我有一个名为"Person"的表,其中包含以下字段
是应该将City,State或Country等标准化并分解到自己的表中,然后此表包含CityId和StateId列.我们正在讨论这是一个好的还是坏的决定.
要添加,我确实有一个City和一个State表(由于与此person表无关的其他原因).无论是否有这个额外的事实,我都很好奇.