问题标签 [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.

0 投票
5 回答
270 浏览

database-design - 额外的表或非特定的外键?

系统中有几种类型的对象,每种对象在数据库中都有自己的表。用户应该能够对其中任何一个进行评论。您将如何设计评论表?我能想到几个选择:

  1. 一个评论表,每个对象类型(ObjectAID、ObjectBID 等)都有一个 FK 列
  2. 多个注释表,每个对象类型一个(ObjectAComments、ObjectBComments 等)
  3. 一个通用 FK (ParentObjectID) 与另一列指示类型 ("ObjectA")

你会选择哪个?有没有更好的方法我没有想到?

0 投票
8 回答
68738 浏览

python - 如何在 python 中规范化 URL

我想知道我是否在 python 中规范化 URL。

例如,如果我有一个 url 字符串,例如:“ http://www.example.com/foo goo/bar.html”

我需要一个 python 库,它将额外的空间(或任何其他非规范化字符)转换为正确的 URL。

0 投票
7 回答
6024 浏览

sql - SQL Server 规范化策略:varchar vs int Identity

我只是想知道这里的最佳解决方案是什么。

假设我有一个规范化的数据库。整个系统的主键是一个varchar。我想知道我应该将此 varchar 与 int 关联以进行规范化还是保留它?保留为 varchar 更简单,但可能更理想

例如我可以有

或者我可以

当然,还要添加几个其他的一对多关系。

大家怎么看?哪个更好?为什么?

0 投票
2 回答
466 浏览

sql - 将规范化表与非规范化索引视图一起使用是个好主意吗?

我目前正在构建一个新的应用程序,具有很高的读写比率。在我现在的雇主中,出于性能原因,我们的表格上有很多非规范化数据。拥有完全 3NF 表然后使用索引视图进行所有非规范化是更好的做法吗?我应该对表或视图运行查询吗?

我感兴趣的一些事情的一个例子是列子表的聚合(例如,将用户帖子计数存储在某处)。

0 投票
3 回答
2111 浏览

mysql - 根据另一个表上的条件查找一个 MySQL 表中的条目

我有一张硬件表和一张事故表。每个硬件都有一个唯一的标签,事件与标签相关联。

如何选择至少有一个事件列为未解决的所有硬件?

我不能只是加入,因为如果一个硬件有多个未解决的问题,它会出现多次。

0 投票
7 回答
1328 浏览

database-design - 数据库设计题——字段或新表+一对多

我正在为一个活动管理站点设计一个数据库——有一个场地表和一个活动表。每个活动都在一个场地中(存储场地的 id),每个场地都在一个城市中。必须可以按城市搜索事件,城市应该是场地表中的一个字段(这可能会由于拼写错误而导致重复的城市)或者应该有一个城市表(每个城市都有一个 id 和一个名称)和将城市与场所(cityid,venueid)连接起来的一对多表?

我知道这是一个非常基本的问题,但我不确定额外的连接和额外的两个表是否值得。

提前致谢

[编辑] @tvanfosson:从多对多变为一对多,因为每个场地都与一个城市相关联。

0 投票
1 回答
311 浏览

database - 规范跨表共享的公共 ID 类型

这是问题的简化版本。

我们有客户向我们发送大量数据,然后进行查询。他们要求我们有几个“公共”ID,他们可以用来查询我们的数据。(大多数人希望通过他们与数据一起发送的 id 来查询我们的系统,但并非总是如此)。为简单起见,我们称它们为“pid”、“crid”和“musicbrainzid”。我们有一个“实体”表来存储这些信息。它看起来像这样(“权威”是发送数据的人):

然后我们有单独的实体,例如“episode”、“series”和“broadcast”(实际上,还有很多,但我在这里保持简单)。其中每一个都有一个指向实体表的 entity_id。

外部客户如何通过 pid 或 crid 搜索并获得适当的剧集或系列,以及正确识别它是什么?给定一个 pid,我们可以获取实体 id,但是我们需要在剧集、系列和广播表中搜索该值。此外,并非所有 id 都必然与所有其他表相关,但任何实体(例如,“episode”)都可能具有多个 id(pid、crid 等)

策略:

  1. 查找 pid 的实体 id 并在每个其他表中搜索该 pid。
  2. 在实体上放置一个“entity_type”列,但如果它是剧集表中的 pid,但我们不小心将剧集.type 设置为系列怎么办?我们不想复制数据,也不想将数据库元数据放入列值中。

选项 1 很慢而且似乎是错误的(此外,各种表的结构不同,这会造成问题)。

选项 2 表示重复数据,并且此数据可能不同步。我们可以使用触发器来强制执行此操作,但这看起来非常讨厌,而且无论如何,mysql 触发器实现中的错误已经多次袭击我们。我们现在正在使用这种策略,但没有触发器。

选项3是什么?

旁注:我们知道我们需要将“权限”分解到一个单独的表中,因为并非所有权限/类型组合都是有效的。

0 投票
2 回答
12921 浏览

javascript - JavaScript 中的程序化重音减少(又名文本规范化或非重音)

我需要比较两个字符串,例如:

吕贝克 == 吕贝克

在 JavaScript 中。

为什么?好吧,我有一个自动完成字段,它使用 Lucene 发送到 Java 服务,其中地名自然存储(如 Lübeck),但也作为规范化文本进行索引,

这样,不知道输入“Mèxico”的人可以输入“mexico”并获得返回“Mèxico”的匹配项(在许多其他可能的点击中,例如“CaféMèxico,迪拜,阿联酋”)。

现在的问题是我无法更改服务以在服务器端进行任何突出显示,因此我在客户端 JavaScript 端突出显示类似的内容:

这有点花哨,因为我在输入中转义了特殊的正则表达式字符。这对于在点击开始时简单的一个单词匹配很好,但如果你突然希望支持像“london cafe”这样的多单词匹配,它真的会崩溃:

这不适用于说“london ca”(正在输入 london cafe),因为它会将“Jack London Cabin, Dawson City, Canada”标记为:"Ja<b>ck</b> <b>London</b> <b>ca</b>bin, Dawson <b>Ci</b>ty, <b>Ca<b/>nada"[特别注意“ck”和“Ci”]

因此,我正在寻找一些不像以下内容那么疯狂的东西:

是否有一个编译表我可以参考映射一系列字符,这些字符是另一个字符的重音版本到该字符,我不是指普通的 unicode 图表。如果是这样,我是否可以避免使用奇怪的、可能很慢的 RegEx 语句?

关于赏金:
在我开始赏金之前,有两个答案,一个是让我用 Ruby 来做,另一个MizzardX写的,它是我在问题中提出的基本形式的完成。现在不要误会我的意思,我真的很感激能像他那样完全解决问题,但我只是希望可能有另一种方法。到目前为止,似乎每个路过查看问题和答案的人都认为 MizzardX 可以很好地涵盖它,或者他们没有不同的方法。我会对不同的方法感兴趣,如果在赏金关闭之前它根本不可用,MizzardX 将赢得赏金(尽管在残酷的转折中,他的编辑使它成为社区 wiki 的答案,所以我不确定是否他会得到赏金的!)

0 投票
10 回答
1065 浏览

database-design - 在没有存储过程或触发器的情况下工作

在过去的 18 个月里,我们一直在研究复杂的数据库和客户端界面。我们会定期向此应用程序添加新功能,现在每天都有数十名用户在我们的所有办公室(包括站点和海外)使用。这只是为了告诉您它是一个带有 REAL 数据库的 REAL 应用程序。

到现在为止,我们仍然不用写任何存储过程,除了临时解决客户端版本和更新数据库模型之间的小问题(旧客户端版本不会正确更新新创建的字段,直到大家安装最新的版本)。

同样,我们仍然不需要任何触发器。事实上,唯一的 SP 和触发器是系统的,或者是为了复制目的而添加的。

当开发人员认为数据库优化必须反对数据库规范化时,我有一种奇怪的感觉,即 SP 和触发器主要用于补偿数据库设计默认值和/或试图绕过数据库设计规则。

问题是这些工具非常耗时(无论是开发还是维护)。然后每个开发人员都应该非常小心地使用它们,记住它们是在数据库中维护的最“昂贵”的项目。

我们是否可以认为在数据库中没有或只有很少的存储过程/触发器是其规范化水平和/或代码维护成本的一个很好的指标?

编辑:

你们中的一些人为使用触发器和 SP 提供了公平的论据。但我一直认为,大多数时候这些工具的使用方式不当或过度。设置了多少触发器来在表字段之间进行一些花哨的更新,或者重新计算总计或其他聚合数据?有多少 SP 用于构建用于报告问题的临时表?这是开发人员使用这些工具的许多情况中的两种,我认为这通常说明数据库设计/规范化缺陷。

其他一些人承认应该严格控制 SP 和触发器的使用。我也觉得很有必要。

我必须承认,我试图找到一些支持的论点,所有这些在我们其他数据库上工作的 SQL 极客都看不起我们,告诉他们的朋友“你知道吗?他们甚至不使用 SP 和触发器!哈哈!”

0 投票
3 回答
2225 浏览

mysql - 将平面文件加载到规范化的 MySQL 数据库中

将数据从平面文件加载到 MySQL 数据库中,然后通过外键创建表之间关系的最快方法是什么?

例如......我有一个格式为:

我需要将其加载到四个表中:

具体来说,如何以一种可扩展的方式填充外键?这些数字在 1000 多个人的范围内,每个人都有 100 万多个基因型。