我是否应该标准化我的数据库?

2024-06-26

在设计数据库(例如 MySQL)的模式时,会出现是否完全规范化表的问题。

一方面,连接(以及外键约束等)非常慢,另一方面,您会获得冗余数据和潜在的不一致。

“最后优化”是正确的方法吗?即创建一个按书本规范化的数据库,然后查看可以对哪些内容进行非规范化以实现最佳速度增益。

对于这种方法,我担心的是,我将选择可能不够快的数据库设计 - 但在那个阶段重构模式(同时支持现有数据)将非常痛苦。这就是为什么我想暂时忘记我所学到的有关“正确”RDBMS 实践的所有内容,并尝试一次“平面表”方法。

该数据库将大量插入的事实是否会影响该决定?


一个哲学答案:次优(关系)数据库充斥着插入、更新和删除异常。这些都会导致数据不一致,导致数据质量较差。如果您不能相信数据的准确性,那有什么好处呢?问问自己:你想要更慢地得到正确答案还是想要更快地得到错误答案?

作为一个实际问题:在快速得到它之前先把它做好。我们人类非常不擅长预测哪里会出现瓶颈。使数据库变得出色,在相当长的一段时间内测量性能,然后决定是否需要使其更快。在非规范化和牺牲准确性之前,请尝试其他技术:您可以获得更快的服务器、连接、数据库驱动程序等吗?存储过程可能会加快速度吗?索引及其填充因子如何?如果这些和其他性能和调优技术不起作用,那么才考虑非规范化。然后测量性能以验证您是否获得了“支付”的速度提升。确保您正在执行优化,而不是悲观化。

[edit]

问:那么如果我最后优化,你可以吗 推荐合理的迁移方式 架构更改后的数据?如果, 例如,我决定摆脱 查找表 - 如何迁移 这个新设计的现有数据库?

答:当然可以。

  1. 进行备份。
  2. 再次备份到不同的设备。
  3. 使用“select into newtable from oldtable...”类型命令创建新表。您需要执行一些联接来组合以前不同的表。
  4. 扔掉旧桌子。
  5. 重命名新表。

BUT...考虑更稳健的方法:

立即在完全标准化的表上创建一些视图。这些视图(虚拟表、数据的“窗口”...询问我是否想了解有关此主题的更多信息)将具有与上面第三步相同的定义查询。当您编写应用程序或数据库层逻辑时,请使用视图(至少用于读取访问;可更新的视图……嗯,很有趣)。然后,如果稍后进行非规范化,请如上所述创建一个新表,删除视图,无论视图是什么,都重命名新的基表。您的应用程序/数据库层不会知道其中的区别。

实际上,在实践中还有更多内容,但这应该可以帮助您入门。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否应该标准化我的数据库? 的相关文章

  • 将数据从 CSV 文件导入 MySQL,科学记数法

    我正在使用 LOAD DATA INFILE 从 CSV 读取数据并将其插入到 MySQL 表中 问题在于 CSV 中的一列采用科学记数法 当读取该列并将其加载到表中时 它不会进入 DOUBLE FLOAT 或 REAL 类型的列 有针对这
  • 如何查看我的 laravel 数据库?

    我已经设置了功能性的 laravel 项目 数据库连接有效 我已经通过终端添加了一些表 但现在我想看到它 就像您可以使用 phpmyadmin 看到所有内容一样 默认情况下如何找到数据库文件以及如何打开它 在终端中 cd 进入项目目录 va
  • ON DELETE CASCADE 与 Symfony 和 Doctrine 的多对多关系

    我想要与 Symfony 和 Doctrine 建立简单的多对多关系 这实际上是一个单向的一对多关联 可以通过连接表映射为文档表明 http doctrine orm readthedocs org en latest reference
  • MySQL:在一条语句上连接多个表

    我有以下数据库结构 层次结构 TABLE 产品类别 id name TABLE product id parent id name 父 ID 是产品类型 ID TABLE treeNode id parent id name type 它是
  • php 连接池 mysql [重复]

    这个问题在这里已经有答案了 我打算使用MYSQL 有可用的连接池扩展吗 或者说连接的正常做法是什么 是不是到处都用这个啊 mysqli connect localhost xxx xxx test 人们正常使用吗mysql connect
  • 有谁知道有一个很好的库可以将一个人的名字映射到他或她的性别吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找一个图书馆或数据库 可以根据一个人的名字或昵称猜测他或她是男性还是女性 就像是 john gt M mary gt F al
  • 使用 Union 或 Join - 哪个更快 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是想知道你是否有一张桌子并且联合起来会比使用联接更有效吗 我确实知道联接创建了更多列 但这更具理论性 联合是否需要像联接那样对另一
  • 如何确定选择哪个数据库

    有没有办法稍后输出当前选择的数据库的名称 只需使用 mysql query 或 mysqli query 甚至更好 或者最好使用 PDO SELECT DATABASE 附录 对于是否可以进行很多讨论FROM DUAL是否应包含在其中 在技
  • 编译器优化 - 函数没有地址

    我没有使用太多指向成员函数的指针 但我认为在使用此类指针时发现了一些危险的情况 当编译器由于某些优化而决定不为函数分配地址时 就会出现问题 VS 2015 即使在调试 x86 中也会发生这种情况 禁用优化 Od 我正在重构一个旧系统 将一些
  • 我的 PHP 脚本如何判断服务器是否繁忙?

    我想运行一个 cron 作业来进行清理 需要大量的 CPU 和 Mysql 资源 我希望它仅在服务器不相对繁忙时运行 从 PHP 中确定这一点的最简单方法是什么 例如 是否有一个查询返回最后一分钟完成了多少个查询 if function e
  • 连接MySQL服务器的Shell脚本

    我有大约 20 个不同的 MySQL 实例 我想轻松连接到它们 而不必每次都输入完整的地址 用户名和超长的密码 我可以做什么来编写此过程的脚本 这样我所要做的就是为每个实例运行一个 sh 脚本 到目前为止我所拥有的 保存为 instance
  • 从多个表插入表

    嘿 我有一个连接表 连接两个不相关的表 两个表都有ID的 我需要选择ID从每个表中使用WHERE具有不同的值 例如这就是我的看法 INSERT INTO c aID bID VALUES SELECT a ID WHERE a Name M
  • 如何使用 mysqli 设置排序规则?

    我的数据库使用 utf8 czech ci 排序规则 我也想将其设置为我的数据库连接 如果我不想要默认的 utf8 general ci Mysqli set charset 不会让我设置排序规则 Here https bugs php n
  • wikidata 获取带有项目标签和值的所有属性

    我的问题是如何从 wikidata 最好是通过 SPARQL 提取在网页上呈现的所有属性及其各自的标签 以Google https www wikidata org wiki Q95维基数据上的条目 对于属性 P414 证券交易所 或 P1
  • 如何在对应用程序影响最小的情况下从 MySQL“切换”到 Amazon RDS?

    Amazon 官方表示 Amazon RDS 让您能够访问熟悉的 MySQL 数据库的全部功能 这意味着您现在已经在现有 MySQL 数据库中使用的代码 应用程序和工具可以与 Amazon RDS 无缝协作 我不明白这一点 Amazon R
  • SQL LIKE 实际上是如何工作的

    例如 当我有这样的字符串时 ABBBCSLAK JDK ASAAAAFJKDSKJFSDF 当我像这样使用 SQL 时 SELECT FROM table WHERE column LIKE JDK 当服务器访问 JDK 时到底会发生什么
  • MySQL 错误:1395 无法从连接视图中删除

    我正在尝试从通过连接多个表生成的视图中删除一条记录 我有一个新用户要在此特定视图上删除和插入 我可以将记录插入视图 但无法从视图中删除 您能指出下面这段 SQL 语句中的错误吗 create view v1 as select a from
  • 部署 Visual Studio 2010 数据库项目

    我有一个 Visual Studio 2010 数据库项目 我想从中生成一个脚本 这只是将该数据库放到另一台机器上 问题是我找不到 对此的解决方案 当我开始这个项目时 我从开发电脑上的数据库导入了 shema 生成了架构对象 所有表和脚本都
  • 时态数据库设计,有一些变化(实时行与草稿行)

    我正在考虑实现对象版本控制 同时需要同时拥有活动对象和草稿对象 并且可以利用某人在这方面的经验的见解 因为我开始怀疑是否有可能在没有潜在可怕的黑客攻击的情况下实现这一点 为了示例 我将把它分解为带有标签的帖子 但我的用例更一般 涉及缓慢改变
  • 在不打开文件的情况下操作/复制 .CSV 数据?

    我正在尝试优化一些代码 这些代码使用存储在 CSV 文件中的一些测试数据进行一些分析并将其数据复制到 Excel 工作表中 此代码通常一次运行数百个测试 每个测试大约需要 4 5 秒 因此有时可能需要几个小时才能完成 我查阅了一些优化技术

随机推荐