想象一下带有一组复选框的Web表单(可以选择其中的任何一个或全部).我选择将它们保存在存储在数据库表的一列中的逗号分隔值列表中.
现在,我知道正确的解决方案是创建第二个表并正确地规范化数据库.实现简单的解决方案更快,我想快速获得该应用程序的概念验证,而无需花费太多时间.
我认为节省的时间和更简单的代码在我的情况下是值得的,这是一个可辩护的设计选择,还是我应该从一开始就将其标准化?
更多上下文,这是一个小型内部应用程序,实际上取代了存储在共享文件夹中的Excel文件.我也在问,因为我正在考虑清理程序并使其更易于维护.在那里有一些我并不完全满意的事情,其中一个是这个问题的主题.
在关系数据库设计中,存在数据库规范化或简单规范化的概念,其是组织列(属性)和表(关系)以减少数据冗余和改善数据完整性的过程.(如维基百科上所写).
由于大多数文章都是技术性的,因此难以理解,我要求有人根据1NF,2NF,3NF甚至3.5NF(Boyce-Codd)的含义的例子写出一个更容易理解的解释.
我是CS的第一年学生,我兼职为我爸爸的小生意做准备.我没有任何实际应用程序开发经验.我用Python编写脚本,用C编写一些课程,但没有这样的.
我父亲有一个小型培训业务,目前所有课程都通过外部网络应用程序进行安排,记录和跟进.有一个导出/"报告"功能,但它非常通用,我们需要特定的报告.我们无权访问实际数据库来运行查询.我被要求建立一个自定义报告系统.
我的想法是创建通用CSV导出并导入(可能使用Python)它们每晚都在办公室中托管的MySQL数据库中,从那里我可以运行所需的特定查询.我没有数据库方面的经验,但了解非常基础知识.我已经阅读了一些关于数据库创建和普通表单的内容.
我们可能很快就会开始拥有国际客户,因此我希望数据库在发生这种情况时不会爆炸.我们目前还有几家大公司作为客户,有不同的部门(例如ACME母公司,ACME医疗保健部门,ACME身体护理部门)
我提出的架构如下:
我在一张纸上"设计"(更像是潦草书写)模式,试图将其标准化为第三种形式.然后我把电源插头插上到MySQL Workbench和它使人们都非常适合我:
(点击查看全尺寸图片)
替代文字http://maian.org/img/schema.png
谢谢你的时间
mysql database schema database-design database-normalization
我前几天正在考虑规范化,而且我想到了,我想不出一个数据库中应该有1:1关系的时间.
名称:SSN?我将它们放在同一个表PersonID:AddressID?同样,同桌.
我可以提出一个很多或者很多的例子:很多(有适当的中间表),但从不是1:1.
我错过了一些明显的东西吗
我已经阅读了引用: 数据取决于键[1NF],整个键[2NF],只有键[3NF].
但是,我无法理解3.5NF或BCNF.这是我的理解:
那么为什么有些3NF表不在BCNF中呢?我的意思是,3NF引用明确地说"除了密钥之外",意味着所有属性仅仅依赖于主键.毕竟,主键是候选键,直到它被选为我们的主键.
如果到目前为止我的理解有任何不妥之处,请纠正我并感谢您提供的任何帮助.
我一直想知道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
在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数据类型的优缺点.
我有很多实例需要在我的数据库中实现某种多态关联.我总是浪费大量的时间来思考所有的选择.这是我能想到的3.我希望有一个SQL Server的最佳实践.
这是多列方法

这是没有外键的方法

这是基表方法

sql-server associations polymorphic-associations database-normalization
我正在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()),但它们都会导致语法错误.
任何人都可以帮助我知道mysql中的规范化是什么,在哪种情况下以及我们如何使用它...
提前致谢.
database ×5
mysql ×3
sql ×2
3nf ×1
associations ×1
facebook ×1
json ×1
left-join ×1
nosql ×1
one-to-one ×1
postgresql ×1
schema ×1
sql-server ×1