问题标签 [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.
database - 每个类似的对象一张桌子?
我为绘图店写了一个应用程序。我的系统中有这些类:商店、购物车、货架和面包店。
它们具有以下属性:
店铺:X、Y、名称、宽度、高度、类型、地址
购物车位置:X、Y、名称、宽度、长度、类型、容量
机架:X、Y、名称、宽度、长度、类型、高度、balance_limit
面包店:X、Y、名称、宽度、长度、类型、open_hours
现在我想在我的数据库中表示这些类。但是你可以看到上面的所有类都有相同的东西,比如:
X、Y、宽度、高度、名称和类型。让它们与众不同的是:
店铺:地址
购物车地点:容量
机架:balance_limit
面包店:open_hours
我知道将来所有这些类型的对象都将拥有自己的新属性,并且它们将获得所有这些对象将同时拥有的新属性。
而且我知道将会有上面没有提到的新类型的对象,它们将具有与商店、购物车位置、货架和面包店相同的一些属性。
我想创建允许我添加新属性和新对象的数据库结构。并添加将同时添加到每个类的新属性。此外,我希望系统设计清晰,并允许我对其进行简单的数据库查询。
所以我的问题是:
我应该为每种类型的对象(商店、购物车位置、货架、面包店)制作一个数据库表,因为它会更清晰,还是应该将它们全部组合到一个表中,因为它们具有相似的属性列表?
我想让你给我一些想法,为什么一种解决方案会比另一种更好。我希望在这里得到一些实用的建议,不仅仅是“你应该这样做,因为这是正确的方式,公理”。
database - 您将如何避免此数据库模式中的数据冲突?
我正在使用 SQL Server 2008 / LinqToSQL / 定制存储库作为 DAL 开发一个多用户 Internet 数据库驱动的网站。我遇到了一个规范化问题,如果利用得当,可能会导致数据库状态不一致,我想知道如何处理这个问题。
问题:几家不同的公司可以访问我的网站。他们应该能够在我的网站上跟踪他们的项目和客户。一些(但不是全部)项目应该可以分配给客户。
这将产生以下数据库架构:
这导致以下关系:
现在,如果用户是恶意的,他可能会插入一个项目,该项目具有他自己的 CompanyID,但其 ClientID 属于另一个用户,从而使数据库处于不一致状态。
这个问题在我的数据库模式中以类似的方式出现,所以如果可能的话,我想以一种通用的方式解决这个问题。我有以下两个想法:
检查可能导致 DAL 不一致的数据库写入。这将是通用的,但在执行更新和创建查询之前需要一些额外的数据库查询,因此会导致性能下降。
为 clients-Projects 关系创建一个附加表,并确保以这种方式创建的关系是一致的。这也需要一些额外的选择查询,但比第一种情况要少得多。另一方面,它不是通用的,因此从长远来看更容易遗漏某些东西,尤其是在向数据库添加更多表/依赖项时。
你会怎么办?我错过了更好的解决方案吗?
编辑:您可能想知道为什么 Projects 表有 CompanyID。这是因为我希望用户能够添加有和没有客户的项目。我需要跟踪无客户端项目属于哪个公司(以及哪个网站用户),这就是项目需要 CompanyID 的原因。
mysql - 使用可选列正确规范化数据库
我需要创建一个数据库表来存储一组假设患者的生理特征(例如收缩压、甘油三酯浓度等)的参数描述。
例如,假设用户为 SBP 指定三角分布,则必须存储最小值、最大值和众数(以及分布类型)。或者,用户可以指定一个正态分布,需要存储平均值和标准偏差。
我正在努力使用正确的方法来规范化这些数据。目前,我有一个 Cohort 表和一个 Distribution 表,其中包含许多一对一的关系,如下所示(省略了一些字段):
(distribution_type 包含一个描述分布的字符串:“Triangular”、“Weibull”等)
我很确定这不是执行此操作的最佳方法,因为我在 Distributions 的每一行中都留下了大量的 NULL 字段。
我的另一个想法是为每种分布类型设置单独的表(一个用于三角形,一个用于高斯,一个用于统一等),并在中间有一个带有 id 列的表(用作队列中的外键table *_dist 列),一个分布类型列和一个 id 列,用于存储相应分布表中行的外键。
该查询将使用存储在 Cohort 列中的 id 从中间表中查找分布类型和行 id,然后使用该 id 在适当的表中查找参数。但是,使用一个字符串来选择合适的表,然后另一个 id 来选择合适的行,这与传统的 JOIN 相去甚远,而且感觉也不是一种非常干净的方法。
那么,是否有人对如何最好地实现这一点(在标准化和/或性能方面)有任何建议?
非常感谢,丰富
database-design - 我如何规范这个数据库设计?
我正在为客户创建一个划船报告和统计系统,目前我的结构类似于以下内容:
这是一个示例数据行,但我想将其扩展到 Rowers 表和 Coaches 表等,但我不知道如何最好地将其链接回 Entries 表,这就是它。
有没有人有什么智慧之言可以和我分享?
更新
一个团队可以有任意数量的教练和赛艇运动员,一个赛艇运动员可以在多个团队中(团队 A、B、C 等),一个团队可以有多个教练。
mysql - 数据库设计:复合键与一列主键
我正在处理的一个 Web 应用程序遇到了一个意外的“错误”——该应用程序的数据库有两个表(以及许多其他表),分别称为“States”和“Cities”。
' States ' 表字段:
' idStates ' 是一个自动递增的主键。
“城市”表字段:
' idAreaCode ' 是一个主键,由国家代码 + 区号组成(例如 91422,其中 91 是印度的国家代码,422 是印度城市的区号)。“ idStates ”是从“ States ”表派生的外键,用于将“ Cities ”表中的每个城市与其对应的州相关联。
我们认为国家代码+地区代码组合对于每个城市都是唯一的,因此可以安全地用作主键。一切正常。但是印度的一个地方在 db 设计中发现了一个意想不到的“缺陷”——印度和美国一样是联邦民主国家,在地理上分为许多州或联邦领土。州和联邦领土数据都存储在“州”表中。然而,有一个地方——昌迪加尔——属于两个州(哈里亚纳邦和旁遮普邦),它本身也是一个联邦领土。
显然,当前的 db 设计不允许我们存储多个城市“ Chandigarh ”的记录。
建议的解决方案之一是创建一个组合列“ idAreaCode ”和“ idStates ”的主键。
我想知道这是否是最好的解决方案?
(仅供参考:我们正在使用带有 InnoDB 引擎的 MySQL)。
更多信息:
- 该数据库存储每个城市的气象信息。因此,州和城市是每个查询的起点。
- 每天使用 CSV 文件插入每个城市的新数据。CSV 文件包括用于标识每条记录的 idStates(用于州)和 idAreaCode(用于城市)列。
- 数据库规范化对我们很重要。
注意:没有为 city 表使用自动递增主键的原因是数据库每天/每小时使用 CSV 文件(由另一个应用程序生成)更新。并且 CSV 文件中的每条记录都由 idStates 和 idAreaCode 列标识。因此,即使表被删除并再次刷新,城市表中使用的主键对于每个城市都是相同的。邮政编码(或 PIN 码)和区号(或 STD 代码)符合唯一、静态(不经常更改)的标准,并且这些现成的列表很容易获得。(我们现在决定使用区号,因为印度正在将其密码更新为新格式)。
我们决定的解决方案是在应用程序级别处理此问题,而不是更改数据库设计。在数据库中,我们将只存储“Chandigarh”的一条记录。在应用程序中,我们为任何搜索“Chandigarh, Punjab”或“Chandigarh, Haryana”创建了一个标志,以将搜索重定向到该记录。是的,这并不理想,但这是一个可以接受的折衷方案,因为这是迄今为止我们遇到的唯一例外。
asp.net - 实现数据库对象的版本控制
我很快就会开始一个项目的工作,这个项目(从规范中)让我想起了 StackOverflow。基本上,它是一个具有用户控制内容的网络应用程序。
让我在脑海中转圈圈的功能之一是版本控制。在 StackOverflow 上,每个问题和答案都可以有多个修订。当您只有一种类型的对象(在这种情况下,还有它的文本)时,这很容易实现。
所以,对于我的简单页面,我已经准备好了。
当我认为某些需要受版本控制的对象具有关系时,问题就出现了。为了提供一个具体的例子,让我选择一个随机的类比域:
假设我正在实施一个类似 Wiki 的网站来跟踪书籍/作者信息。该站点的主要重点是创建和更新“作者”页面,作为文本,这些页面非常简单(如上所述)。然而,让我们在作者和书籍之间添加一个一对多的关联(换句话说,书籍将是单独的对象,因为显然一个人可以编写许多书籍)。每本书都有一个从作者页面到关于该书的信息页面的链接。
对于用户而言,描述作者的基于文本的“摘要”与该作者与其作品之间的链接之间几乎没有区别。因此,我们需要为作者页面、书籍页面以及作者与书籍之间的关联实现“修订”/编辑功能。换句话说,用户应该能够编辑、查看历史记录和回滚作者页面、书籍页面以及两者之间的关联。
当这种关系变成多对多时,这变得更加复杂,其中可以将多个作者列为对一本书做出贡献。
我有很多解决方案,但没有一个像我想要的那样干净(并且至少涉及一些重复的代码/冗余数据存储),虽然我确实在这里看到了共性,但我觉得我还没有真正能够最好地提取它,尤其是在数据库级别。我不想对给出的答案产生偏见,所以我不会马上给出。
那么,您将如何在数据库级别设计该系统?我在这里寻找表格规范,如果不是很明显的话,可能还有你如何使用它们的描述。对于那些可能相关的答案,我将使用 ASP.NET 和 Linq-to-SQL(我对 LTS 中的多对多感到满意)或实体框架。
编辑:澄清一下,我了解基本的数据库设计、规范化、多对多映射表等。我正在为这种特定情况寻找一个干净的解决方案。
编辑2:我正在寻找一个通用的解决方案,因为系统中可能有更多的子对象而不仅仅是书籍。作者可能与其他作者、杂志、事件等有关。如果我为每个作者单独实现历史,我觉得我正在重复很多工作。
postgresql - 将具有重复项的表拆分为 2 个规范化表?
我有一个包含一些重复行的表,我想将它们规范化为 2 个表。
我想首先将其规范化为两个表(用户和 url_keyword)。有没有可以运行的查询来规范化这个,或者我是否需要使用脚本遍历表来构建表?
mysql - 超出 MySQL 知识的规范化?
我想我已经规范了我的数据库超出了我的 SQL 知识。:) 这是我在斯诺克联赛网络应用程序中遇到的一个问题。它计算了一支球队所有赛季的高休息时间的总体统计数据。在示例中,团队 ID 为 3。
表:
- 火柴 :
- 休息:
- team_members :多对多表。
除了一个问题之外,上面的查询几乎可以按预期工作。如果一名球员为多支球队效力,那么他为所有球队所拥有的休息时间将包含在这些统计数据中。
如果 Breaks 表有一个额外的字段“break_team”,则查询将是微不足道的。所以我的问题是双重的,任何人都可以协助进行正确的查询,还是我应该稍微减少标准化以帮助这些统计数据?什么时候去规范化?
database - 如何在数据库中建模标签?
我有一个现有的 web 应用程序并想添加一个标记功能,以便用户可以标记现有的对象。问题是我应该为每个对象添加一个标签列吗?还是应该对其进行规范化并使用标签表,其中每个对象都有一组标签?我倾向于后者,因为它感觉更干净,更容易报告并且更容易创建标签云。但是因为我知道这已经解决了 1000 次,所以我想问一下我是否遗漏了什么?
oracle - Oracle:在迁移期间规范化数据
我有一个包含很多重复数据的表,我想将其重构为 3 个表。
当前结构如下:
current_table 中的数据如下所示:
我想创建一个会议表和一个主题表,PK 来自一个序列:
我想不通的是如何将数据插入到新表中。我试过了:
但这当然行不通。有没有一种简单的方法来规范化数据?