数据库必须有多“完美”?

时间:2010-12-14 02:38:32

标签: mysql database database-design data-modeling

我正在设计一个网站来跟踪举重和卡路里。我之前从未设计过自己的数据库,在开始编码之前,我认为我应该尽可能地获得数据。每次我想我已经完成了,我会觉得它并不完美。我主要在MySQL Workbench中充实它,但我还有几个问题。

  • 制作它有多重要 数据库“完美”在手?怎么样 难以重新计算数据库的因素 以后?
  • 引擎选项有什么作用?对 现在所有表都默认为 InnoDB引擎?这有什么问题吗?
  • 数据后数据表是否可更改 条目?也许不会去VARCHAR 到INT,但是VARCHAR(45)到了什么 VARCHAR(255)?
  • 拥有的基本数据库规则是什么 是否成功设计?

我还附上了我的ERM图。如果有人能指出任何明显的违规行为,我们将不胜感激。

alt text

10 个答案:

答案 0 :(得分:12)

尽可能完美地开始,然后根据需要将其设置为不完美。

答案 1 :(得分:3)

没有实用的,操作数据库是完美的。他们都有疣。

使用数据库的一大优势是可以构建它以承受未来的变化。例如,使用存储过程进行数据更新和添加数据。如果最终拆分表,则可以相应地修改存储过程,而不会对任何外部软件产生明显影响。

如果你等到设计完美,你就永远无法实现任何有用的东西。

答案 2 :(得分:2)

一般情况下,尝试让您的实体解决问题,但在事实发生之后添加字段,索引等并不是什么大不了的事。重构实体以支持不同的基数更为复杂。

乍一看,有几件事情爆发...... 1.练习表中所有这些编号的字段。巨大的红旗。我马上就会重构它。 2.徽章 - > userbadges。即使您对名称强制执行唯一约束,我仍然会为该表创建一个新的PK(一个id)。 3.我还需要一些时间来规范你的id字段的命名(即在用户中,你使用'userid'但在食物中,你使用'id'而不是'foodid')。你选择哪种方式是一个选择问题,但要尽量保持一致。

答案 3 :(得分:2)

“完美的SQL数据库”的问题在于,SQL缺乏超越某个微不足道的“完美数据库”的能力。

但是,听听你的老师并让Codd自豪(3NF / BCNF等等)。稍后添加缓存或临时非规范化数据(性能,需要时)等比尝试修复充满坏数据的数据库要容易得多。数据想要爱。喜欢它。

在这里说的是我要指出的一些事情:

  1. exercise看起来错误,错误,错误 - secondary1,secondary2,secondaryN ......不,谢谢!我不会像这样离开架构!

  2. userid是PK(varchar),但usernumber是int?再次,不,谢谢。这似乎与其他表格的格式不同(大多数是id),并且应该提示某些内容可能不正确。也许userid(或username?)应该只有一个唯一约束(您也可以将索引添加到其他列中 - PK通常在单调递增值时“效果最好”,尽管DB应该有一个-index计划表。)

  3. 命名不一致(userid vs usernumber vs id)。不用了,谢谢。我不在乎你选择什么 - 但请一贯做到。

  4. 我的快速回顾。 快乐的发展。

答案 4 :(得分:1)

看起来很不错......除了你的exercise表。 secondary1secondary10字段可能会出现在不同的表格中。但是,你在其他地方做得很好,所以也许这是有道理的吗?考虑一下并确保。

完美并不重要,事情可以(并且会)在你完成后改变。尝试尽可能地降低标准化(你已经完成了这个)。字段大小可以更改,不用担心。

答案 5 :(得分:1)

已经给出了很多好的建议。这里还要补充两点:

1 - 永远不要以明文形式存储密码。给它加盐,用加密安全散列哈希,然后存储salt / hash。

2 - 以UTC格式存储日期/时间,并在演示层转换为所需的时区。 (我总是将datetime存储为unix时间戳,但这只是我的偏好.Mysql DATETIME没有错。)

我建议您在完全提交之前测试您的设计,并围绕它编写整个应用程序。将您的设计推送到真正的mysql数据库并编写一些quire以确保您可以添加和检索所需的所有信息。一旦你的quires正常运行,就编写一个脚本来加载数据库(数百万到数百万条记录)并再次运行你的quires。这是测试您的设计的最佳方式。当你只有几百条记录时,几乎任何查询都会很快。一旦您的数据库达到临界质量并且不再适合ram,您真的能够判断您的设计和索引是否针对您的预期用途进行了优化。

答案 6 :(得分:1)

数据库更改是可以预期的,问题是如何管理它。设计至少Boyce-Codd / 5th Normal Form有助于避免设计中的内置偏差,并在必要时使架构更容易发展。

在需要之前,请小心添加太多设计。如果您将架构设计得远远超过应用程序和使用它的其他数据使用者,那么您很可能必须在以后进行更多更改。如果可以,应用YAGNI原则并对项目应用Agile迭代方法。

在开发过程中,我发现从模式开始尽可能的限制开始是有意义的,如果你需要以后再放宽这些限制。例如,如果您不确定是否应该始终应用某些业务规则,那么最好还是强制执行它。放松约束或稍后选择一些东西很容易,但是一旦构建了依赖代码,实现代码不适合的新规则就会困难得多。

小心“重构”这个词。数据库模式更改通常会更改数据库的含义和行为。从应用程序的角度来看,它可能是重构,但就数据库而言,大多数架构更改都是功能性的而不是非功能性的更改。

答案 7 :(得分:1)

完美是善的敌人。平庸和坏人也是善的敌人。

正如其他人所说,学习如何规范化数据。至少达到BCNF。之后,您可以了解何时忽略规范化规则。

更一般地说,学习数据的关系模型。在这方面有优秀的文本。有关首发,请参阅CJ日期。不要等到你学会了整个模型来构建你的第一个数据库。

数据的关系模型经常导致结果看起来与相同数据的对象模型不匹配。了解如何应对这种不匹配。

准备应对变化。

答案 8 :(得分:0)

  1. 我怀疑任何数据库都是完美的;不要让完美成为善的敌人。
  2. InnoDB强制对外键进行引用完整性。
  3. 任何ALTER都可以完成,但除了表格之外,您可能还需要修改数据。
  4. 应遵循规范化规则,良好的索引实践(例如,每个WHERE子句一个)等。

答案 9 :(得分:0)

你的设计看起来很不错!

现在最重要的是走出你的用例和用户对话框,看看是否所有流都很容易支持。

完美的用户体验比完美的数据库更重要。