标签: database-normalization

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

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

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

我认为节省的时间和更简单的代码在我的情况下是值得的,这是一个可辩护的设计选择,还是我应该从一开始就将其标准化?

更多上下文,这是一个小型内部应用程序,实际上取代了存储在共享文件夹中的Excel文件.我也在问,因为我正在考虑清理程序并使其更易于维护.在那里有一些我并不完全满意的事情,其中​​一个是这个问题的主题.

database database-design database-normalization

346
推荐指数
8
解决办法
6万
查看次数

什么是数据库常规表单,您能举例说明吗?

在关系数据库设计中,存在数据库规范化或简单规范化的概念,其是组织列(属性)和表(关系)以减少数据冗余和改善数据完整性的过程.(如维基百科上所写).

由于大多数文章都是技术性的,因此难以理解,我要求有人根据1NF,2NF,3NF甚至3.5NF(Boyce-Codd)的含义的例子写出一个更容易理解的解释.

database database-design database-normalization

269
推荐指数
4
解决办法
24万
查看次数

首次数据库设计:我是否过度工程?

背景

我是CS的第一年学生,我兼职为我爸爸的小生意做准备.我没有任何实际应用程序开发经验.我用Python编写脚本,用C编写一些课程,但没有这样的.

我父亲有一个小型培训业务,目前所有课程都通过外部网络应用程序进行安排,记录和跟进.有一个导出/"报告"功能,但它非常通用,我们需要特定的报告.我们无权访问实际数据库来运行查询.我被要求建立一个自定义报告系统.

我的想法是创建通用CSV导出并导入(可能使用Python)它们每晚都在办公室中托管的MySQL数据库中,从那里我可以运行所需的特定查询.我没有数据库方面的经验,但了解非常基础知识.我已经阅读了一些关于数据库创建和普通表单的内容.

我们可能很快就会开始拥有国际客户,因此我希望数据库在发生这种情况时不会爆炸.我们目前还有几家大公司作为客户,有不同的部门(例如ACME母公司,ACME医疗保健部门,ACME身体护理部门)

我提出的架构如下:

  1. 从客户的角度来看:
    • 客户是主要的表
    • 客户与他们工作的部门相关联
      • 各部门可以分散在一个国家:伦敦的人力资源部门,斯旺西的市场营销部门等.
      • 部门与公司的部门相关联
    • 部门与母公司相关联
  2. 从班级角度来看:
    • 会话是主要的表格
      • 教师与每个课程相关联
      • 每个会话都有一个statusid.例如0 - 已完成,1 - 已取消
      • 会话被分组为任意大小的"包"
    • 每个包都分配给客户端

我在一张纸上"设计"(更像是潦草书写)模式,试图将其标准化为第三种形式.然后我把电源插头插上到MySQL Workbench和它使人们都非常适合我:
(点击查看全尺寸图片)

替代文字http://maian.org/img/schema.png

示例查询我将运行

  • 哪些有信用额度的客户仍处于闲置状态(未来未安排课程的客户)
  • 每个客户/部门/部门的出勤率是多少(以每个会话中的状态ID来衡量)
  • 一个月有一个老师有几节课
  • 标记出勤率低的客户
  • 人力资源部门的自定义报告,其部门的人员出勤率

问题(S)

  • 这是过度工程还是我正确的方向?
  • 对于大多数查询,是否需要连接多个表会导致性能大幅下降?
  • 我已经向客户添加了"lastsession"列,因为它可能是一个常见的查询.这是一个好主意还是我应该严格规范化数据库?

谢谢你的时间

mysql database schema database-design database-normalization

245
推荐指数
5
解决办法
2万
查看次数

有没有时间使用数据库1:1的关系是有道理的?

我前几天正在考虑规范化,而且我想到了,我想不出一个数据库中应该有1:1关系的时间.

名称:SSN?我将它们放在同一个表PersonID:AddressID?同样,同桌.

我可以提出一个很多或者很多的例子:很多(有适当的中间表),但从不是1:1.

我错过了一些明显的东西吗

sql database-design one-to-one database-normalization

157
推荐指数
14
解决办法
3万
查看次数

简单来说3NF和BCNF之间的区别(必须能够解释为8岁)

我已经阅读了引用: 数据取决于键[1NF],整个键[2NF],只有键[3NF].

但是,我无法理解3.5NF或BCNF.这是我的理解:

  • BCNF比3NF更严格
  • 表中任何FD的左侧必须是超级键(或至少是候选键)

那么为什么有些3NF表不在BCNF中呢?我的意思是,3NF引用明确地说"除了密钥之外",意味着所有属性仅仅依赖于主键.毕竟,主键是候选键,直到它被选为我们的主键.

如果到目前为止我的理解有任何不妥之处,请纠正我并感谢您提供的任何帮助.

database relational-database 3nf database-normalization

148
推荐指数
6
解决办法
18万
查看次数

Facebook数据库设计?

我一直想知道Facebook如何设计朋友< - >用户关系.

我认为用户表是这样的:

user_email PK
user_id PK
password 
Run Code Online (Sandbox Code Playgroud)

我用用户的数据(性别,年龄等通过用户电子邮件连接,我会假设)来计算表格.

它是如何将所有朋友连接到此用户的?

像这样的东西?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 
Run Code Online (Sandbox Code Playgroud)

可能不是.因为用户数量未知并且将会扩展.

sql database-design facebook database-normalization database-table

130
推荐指数
10
解决办法
17万
查看次数

MYSQL 5.7中的原生JSON支持:MYSQL中JSON数据类型的优缺点是什么?

在MySQL 5.7中,添加了一种用于在MySQL表中存储JSON数据的新数据类型.这显然是MySQL的一个巨大变化.他们列出了一些好处

文档验证 - 只有有效的JSON文档可以存储在JSON列中,因此您可以自动验证数据.

高效访问 - 更重要的是,当您将JSON文档存储在JSON列中时,它不会存储为纯文本值.相反,它以优化的二进制格式存储,允许更快地访问对象成员和数组元素.

性能 - 通过在JSON列中的值上创建索引来提高查询性能.这可以通过虚拟列上的"功能索引"来实现.

方便性 - JSON列的附加内联语法使得在SQL中集成Document查询非常自然.例如(features.feature是JSON列):SELECT feature->"$.properties.STREET" AS property_street FROM features WHERE id = 121254;

哇 !它们包括一些很棒的功能.现在,操作数据更容易.现在可以在列中存储更复杂的数据.所以MySQL现在用NoSQL来调味.

现在我可以想象一下JSON数据的查询

SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN 
( 
SELECT JSON_EXTRACT(data,"$.inverted") 
FROM t1 | {"series": 3, "inverted": 8} 
WHERE JSON_EXTRACT(data,"$.inverted")<4 );
Run Code Online (Sandbox Code Playgroud)

那么我可以在少数json colum中存储巨大的小关系吗?好吗?它是否会破坏正常化.如果这是可能的,那么我猜它会像MySQL列中的NoSQL一样.我真的想知道更多有关此功能的信息.MySQL JSON数据类型的优缺点.

mysql database json nosql database-normalization

96
推荐指数
5
解决办法
5万
查看次数

在SQL Server中实现Polymorphic Association的最佳方法是什么?

我有很多实例需要在我的数据库中实现某种多态关联.我总是浪费大量的时间来思考所有的选择.这是我能想到的3.我希望有一个SQL Server的最佳实践.

这是多列方法

多列方法

这是没有外键的方法

没有外键方法

这是基表方法

基表方法

sql-server associations polymorphic-associations database-normalization

53
推荐指数
1
解决办法
1万
查看次数

对于连接表的array_agg,Postgres返回[null]而不是[]

我正在Postgres中选择一些对象及其标签.架构非常简单,有三个表:

对象 id

引用的Tagging id | object_id | tag_id

标签 id | tag

我正在加入这样的表,array_agg用于将标签聚合到一个字段中:

SELECT objects.*,
    array_agg(tags.tag) AS tags,
FROM objects
LEFT JOIN taggings ON objects.id = taggings.object_id
LEFT JOIN tags ON tags.id = taggings.tag_id
Run Code Online (Sandbox Code Playgroud)

但是,如果对象没有标签,Postgres会返回:

[ null ]
Run Code Online (Sandbox Code Playgroud)

而不是一个空数组.如果没有标签,如何返回空数组?我已经仔细检查过我没有返回null标签.

所述骨料文档说"聚结功能可用于在必要时代替零或空数组空".我试过COALESCE(ARRAY_AGG(tags.tag)) as tags但它仍然返回一个null数组.我试过让第二个参数很多东西(例如COALESCE(ARRAY_AGG(tags.tag), ARRAY()),但它们都会导致语法错误.

postgresql left-join database-normalization

38
推荐指数
3
解决办法
1万
查看次数

MYSQL中的规范化

任何人都可以帮助我知道mysql中的规范化是什么,在哪种情况下以及我们如何使用它...

提前致谢.

mysql database-normalization

37
推荐指数
2
解决办法
5万
查看次数