Questions tagged «normalization»

规范化是将列组织到关系数据库内的表中的过程,以最大程度地减少冗余并避免插入,更新和删除异常。


3
重复列以加快查询速度?
标题没有太大意义,但我想这个问题的标题更好。 我有下表 专案 ID 名称 顾客 ID id_project 名称 付款方式 ID id_customer 日期 和 当用户进入系统时,他将有权访问某个项目。现在,我要列出该项目的所有付款,这应该很简单: SELECT FROM payments where id_customer in (SELECT id from customers where id_project = 5) 我的问题是:用这种方式向付款表添加id_project列是否更好,这将使查询更容易,更快捷。

7
通过将街道地址分成多个单独的列可以解决哪些问题?
我们有一个团队为软件开发人员设计表格和关系。在我们的组织中,他们对执行3NF标准化非常严格-坦白地说,鉴于我们的组织规模以及需求或客户随时间的变化,我同意。我对他们的设计决定背后的原因只有一个不清楚的地方:地址。 虽然这主要针对美国的地址,但我认为这可以适用于任何这样做的国家。地址的每个部分在地址表中都有自己的列。例如,以这个肮脏的美国地址为例: Attn: Jane Doe 485 1/2 N Smith St SW, APT 300B Chicago, IL 11111-2222 它会像这样在数据库中拆分: 街道号:485 街道分数:1/2 街道定向:N(北) 街道名称:史密斯 街道类型:ST(街道) 街后:SW(西南) 城市:芝加哥 州:IL(伊利诺伊州) 邮政编码:11111 邮政编码:2222 国家(假设为美国) 注意:Jane Doe 邮政信箱:NULL 居住类型:APT(公寓) 居住人数:300B 并且还会有其他几列与乡村路线和合同路线相关。此外,我们的特定应用程序可能会包含一些国际地址。数据建模人员表示,他们将添加特定于国际地址的列,即通常的第1行,第2行字段。 起初我以为这太过分了。反复进行在线研究是指使用地址行1、2、3和可能的4,然后划分城市,地区和邮政编码。对于这种粒度很有用的新应用程序,我们确实有一个用例。我们必须验证用户没有创建重复业务,并且检查地址是验证之一。我们可以使其与地址线1和2一起使用,但这会更加困难。 对于我们的特定应用程序,我们需要为企业和个人存储多种地址(实体地址,邮件地址,运输地址等)。我们可能需要生成可打印的套用信函,但到目前为止尚未讨论该要求。 我们组织中的应用程序还需要支持其他一些功能: 审核(带有完整的历史记录表) 打印邮件标签 生成打印表格 报告(针对国家和地区政府) 虽然我们的应用程序可能无法像其他应用程序那样做所有事情,但是将地址拆分为多个组件是我工作的企业标准。无论我们的应用程序是否将从中受益,我们都被迫这样做。 半相关的StackOverflow问题:一个好的地址解析器在哪里被关闭,但是它说明了解析地址有多困难。 为了让我更好地了解他们的设计决策,并向我们的客户推销该想法... 将街道地址分为几列可以解决哪些问题? 对于实施了这样的系统的任何人,如果他们遇到了问题,就会获得加分。

3
如何与有特权的孩子建立一对多关系?
我想建立一对多关系,其中对于每个父母,一个或零个孩子被标记为“收藏夹”。但是,并不是每个父母都会有一个孩子。(例如,将父母视为本网站上的问题,将孩子视为答案,将喜欢的事物作为接受的答案。)例如, TableA Id INT PRIMARY KEY TableB Id INT PRIMARY KEY Parent INT NOT NULL FOREIGN KEY REFERENCES TableA.Id 我看到的方式可以将以下列添加到TableA中: FavoriteChild INT NULL FOREIGN KEY REFERENCES TableB.Id 或TableB的以下列: IsFavorite BIT NOT NULL 第一种方法的问题在于它引入了可为空的外键,据我所知,它不是标准化形式。第二种方法的问题是,需要做更多的工作以确保最多一个孩子是最爱的。 我应该使用哪种标准来确定使用哪种方法?或者,还有其他我没有考虑的方法吗? 我正在使用SQL Server 2012。

4
有没有工具可以检查我的数据库是否被规范化为第三种形式?
我最近了解了标准化,并了解实现新架构时标准化的重要性。 如何检查我的数据库是否符合2NF或3NF标准? 手动检查是肯定的选择,但是我在这里寻找自动化工具。 我不是在寻找点击工具,而是要突出一些可能的优化以使其符合3NF表的功能。我猜它可能使用基于良好样本数据和/或列名语义分析的统计信息。

4
如何处理可变列的表设计
我有一个表设计方案,作为非DBA类型,我想就哪种方案更具可扩展性提出意见。 假设您被要求在都市圈的房屋上记录信息,从一个小社区(200座房屋)开始,但最终增长到5000000多个房屋。 您需要存储以下基本信息:ID#(可以用作唯一索引的唯一批号),Addr,City,State,Zip。很好,简单的表可以处理它。 但是每年,都将要求您记录有关所有房屋的额外信息-信息将每年更改。因此,例如,在第一年,要求您记录所有者的姓氏和平方英尺。第二年,要求您保留姓氏,但丢弃平方英尺,而是开始收集所有者的名字。 最后-每年,额外列的数量都会改变。可能从2个额外的列开始,然后在明年移至6,然后回落至2。 因此,一种表方法是尝试将自定义信息添加为房屋表中的列,因此只有一个表。 但是我有一种情况,有人为此安排了桌子: “房屋表”列:ID,地址,城市,州,邮政编码-每个房屋只有一行 ID Addr City State Zip ------------------------------------------- 1 10 Maple Street Boston MA 11203 2 144 South Street Chelmsford MA 11304 3 1 Main Avenue Lowell MA 11280 “自定义信息表”列:ID,名称,值-表如下所示: ID Name Value 1 Last Name Smith 2 Last Name Harrison 3 Last Name …

1
为具有多个多对多关系的视频游戏业务领域设计数据库
我对数据库设计比较陌生,因此决定创建自己的假设数据库进行实践。但是,我难以建模和规范化它,因为我认为存在许多多对多(M:N)关系。 一般方案说明 该数据库旨在保留有关在Zelda系列上工作过的各种人员的数据。我想跟踪的控制台(S) ,一个游戏可以玩上,员工是曾在部分游戏的发展,乔布斯的员工有(很多员工在不同的工作职位在多个游戏等) 商业规则 多个员工可以从事多个游戏。 多个游戏可以在同一控制台上。 多个控制台可以是同一游戏的平台。 多个雇员可以具有相同的工作。 一个雇员可以有多个工作。 一个游戏可以有多个雇员。 一个游戏可以有多种类型的乔布斯在它的发展 多个游戏可以附加相同类型的作业。 一个控制台可以有多个人做这个工作。 一个人可以在多个控制台上工作。 属性名称和样本值 员工姓名,可以分成第一和最后(例如“约翰”和“李四”) 游戏标题(例如“时间之笛”) 职务(例如“关卡设计”,“导演”,“沉着”,“关卡设计师”,“程序员”,“本地化”等)。 控制台名称(例如“ Game Boy Advance”) 问题 到目前为止,无论我设计什么,似乎到处都存在感兴趣的实体类型之间的数据冗余和M:N关系。但是,我认为数据库设计人员必须始终遇到这种问题,因此必须找到解决方案。 注意:我很容易找到填充表的数据,问题是将其组织到具有标准化表格的数据库中。

4
区块链(比特币)作为数据库?
我正在阅读此BBC新闻文章和以下摘录,引起了我的注意。听起来像“ 永远在线”可用性组或“ 高可用性镜像”,也许自动包含了安全性。 区块链是否可能成为现代,高交易量应用程序的潜在数据库解决方案? 很容易看出它对于诸如个人病历之类的小额交易的价值,但是大容量数据库又如何呢? 什么是区块链? 区块链依靠密码学来允许一组计算机在不需要中央参与者的情况下对全局记录进行更改。 取消中间商可以减少几乎每个部门的成本。 区块链是一个分类账,按时间顺序或“链”记录发生在称为“块”的数据集合中的所有事件。 作为一种货币,这是一个重要的功能,因为它使用户可以确保自己的数字货币是一种,就像钱包中每个钞票的唯一性一样。 “区块链技术将成为我们创造资产的方式,因为它使您无需复制即可传输数字信息,”建设区块链网络的Chain.com首席执行官亚当·卢德温(Adam Ludwin)说。 区块链可用于跟踪各种信息的历史并保持其价值,例如,医生可以使用它来更新病历。 由于对区块链的每次更改都是在整个网络中同时进行的,因此不会丢失任何信息,并且由于无法撤消更改,系统将保持其透明性。需要一个特殊的密钥来更改每个块,因此个人可以通过保护该密钥来保护其记录安全。

6
数据库规范化已死吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 已关闭6年。 我从小就读过-我们学会了在应用程序的业务层之前设计数据库架构(或使用OOAD进行其他所有操作)。我在设计模式(IMHO :)方面一直做得很好,并且进行规范化只是为了删除不必要的冗余,而没有在影响速度的地方进行标准化,即,如果联接对性能造成了影响,则冗余就留在了原处。但大多数情况并非如此。 随着一些ORM框架(如Ruby的ActiveRecord或ActiveJDBC)的出现(还有我不记得的其他几个,但是我敢肯定有很多),似乎他们更喜欢为每个表使用代理键,即使有些表具有主键,例如'电子邮件'-彻底破坏2NF。好的,我了解不多,但是当其中一些ORM(或程序员)不承认1-1或1-0 | 1(即1到0或1)时,我(几乎)感到不安。他们规定,最好将所有内容都放在一张大桌子上,而不管它是否有大量的nulls “当今系统可以处理它”,这是我经常听到的评论。 我同意内存限制确实与规范化有直接关系(还有其他好处:),但是在 当今廉价的内存和四核计算机的时代,DB规范化的概念是否留给文本?作为DBA,您是否仍在对3NF(如果不是BCNF :)进行标准化?有关系吗?“脏模式”设计是否适合生产系统?如果仍然有意义,应该如何为“归一化”提出理由。 (注意:我不是在谈论数据仓库的星型/雪花模式,这种模式作为设计的一部分/需求是冗余的,但是带有后端数据库(例如StackExchange)的商业系统)

6
归一化:是否可以将静态数字(如年份)拆分到自己的表中?
我正在与另一位数据库设计师就标准化进行有趣的讨论。在此示例中,我们有一个GameTitles表,每个记录必须包含游戏发布的年份。他说2NF要求必须对所有内容进行规范化,因此,为了合规,年份字段应拆分为带有自己主键的ReleaseYears表,该主键由GameTitles表引用。我说它应该保留为GameTitles表本身上的一个字段。 我对此的论点是,一年只是一个非原始的数值,从本质上说是静态的(即2011年始终为2011年)。因此,它是它自己的标识符,因为它就是它,所以不需要引用它。这还引入了额外的维护,因为您现在必须在表中添加一个新的年份以供参考。如果您在表中使用大范围的年份进行填充,那么您将拥有多余的记录,这些记录可能根本不会引用它们。这也增加了数据库的大小,因为您现在有了额外的表,记录开销以及年份本身的额外主键。如果将年份保留为GameTitles表中的字段,则可以消除所有这些额外的维护和开销。 有这个想法吗? 编辑:打算将此发布在StackOverflow上。有人可以投票删除它或举报以引起注意吗?

2
标准化练习资源
我想提高我的数据库规范化技能。在网上哪里可以找到高质量的初学者到高级水平的练习(包括解决方案)?

6
举例说明2NF与3NF
我对第二范式(2NF)有疑问,但无法使用Google来解决。这让我发疯,因为我是一名老师,而且我不想向学生们教错误的东西。 让我们有一个包含5个字段的表格。 评分= {学生姓名,学科编号,学科名称,#考试,年级} 依赖性是这样的: 学生姓名,科目代码,#考试->年级 SubjectCode-> SubjectName SubjectName-> SubjectCode 因此,候选键1是{StudentName,SubjectCode,#Exam},候选键2是{StudentName,SubjectName,#Exam}。 主要属性是{StudentName,SubjectCode,SubjectName,#Exam},非主要属性是Grade 根据第二范式的定义,非素数属性不能取决于候选密钥的一部分。唯一的非素数属性(Grade)不依赖于候选键的一部分,因此该表看起来像2NF。 问题是我认为有些不对(我可能错了)。我认为受试者应该有自己的桌子。 评分= {学生姓名,学科代码,#考试,年级} 主题= {主题代码,主题名称} 但是2NF不会产生这种情况。3NF与非素数属性之间的依赖关系有关,因此也不会产生这种情况。但是在我看来,这是正确的结果,因为它没有冗余。 我想如果非素数属性定义为“不是候选键的属性”,则2NF将产生所需的结果。但是我已经一遍又一遍地检查了这一点,并且非素数属性被定义为“对候选键不信任的属性”。 我究竟做错了什么?

2
一对一关系是否正常化?
考虑我们有大量的统计数据记录;例如20-30 INT列。最好将整个集合都保留在一个表中,因为它们都属于一条记录,还是创建另一个具有一对一关系的表。 前者的优点是避免JOIN并可以快速访问相应记录的所有统计数据。 后者的优点是使色谱柱保持整洁。第一列是读密集型的,第二列是写密集型的。当然,我认为它对性能没有显着影响,因为我将InnoDB与行级阻塞一起使用。 总的来说,我想知道为一条记录分离不同的数据集是否有用?

1
生成发票和跟踪
系统每2周就会为公司生成发票。 公司将在每月的1号和16号收到发票。(它将每2周通过Cron Job运行一次。它会扫描订单表,然后将其添加到“发票”表中。是否有其他选择?) 表格中有客户订单的清单,orders还指出了它属于的公司(orders.company_id) 该invoice表从orders表中计算订单的总成本。 我试图弄清楚如何设计合理的发票跟踪。有时公司会向我发送费用,或者有时我会向他们发送费用(invoice.amount) 我需要使用以下方式跟踪发票: 公司给我汇款时 我什么时候汇款到公司的 从公司收到了多少钱 我寄给公司多少钱 我收到了全部款项吗(如果没有,我需要在Db上更新什么?) 发票状态(已发送,已取消,已收金额,已发送金额) 这是我想出的数据库设计: 公司表 mysql> select * from company; +----+-----------+ | id | name | +----+-----------+ | 1 | Company A | | 2 | Company B | +----+-----------+ 客户可以从我的网站选择一家公司。 订单表 mysql> select * from orders; +----+---------+------------+------------+---------------------+-----------+ | id …

3
历史/时间表的最佳做法?
假设我有一个对象,其中包含我要跟踪历史记录的某些字段,以及某些我不想跟踪历史记录的字段。从规范化的角度来看,以下架构是否正确: CREATE TABLE MyObject AS ( MyObjectId INT IDENTITY NOT NULL PRIMARY KEY, MyObjectField1 VARCHAR(100) NOT NULL, MyObjectField2 VARCHAR(100) NOT NULL, MyObjectField3 VARCHAR(100) NOT NULL, MyObjectTrackedField1 VARCHAR(100) NOT NULL, MyObjectTrackedField2 VARCHAR(100) NOT NULL, MyObjectTrackedField3 VARCHAR(100) NOT NULL, ) CREATE TABLE MyObjectHistory AS ( MyObjectHistoryId INT IDENTITY NOT NULL PRIMARY KEY, …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.