我正在设计一个网站来跟踪举重和卡路里。我之前从未设计过自己的数据库,在开始编码之前,我认为我应该尽可能地获得数据。每次我想我已经完成了,我会觉得它并不完美。我主要在MySQL Workbench中充实它,但我还有几个问题。
我还附上了我的ERM图。如果有人能指出任何明显的违规行为,我们将不胜感激。
答案 0 :(得分:12)
尽可能完美地开始,然后根据需要将其设置为不完美。
答案 1 :(得分:3)
没有实用的,操作数据库是完美的。他们都有疣。
使用数据库的一大优势是可以构建它以承受未来的变化。例如,使用存储过程进行数据更新和添加数据。如果最终拆分表,则可以相应地修改存储过程,而不会对任何外部软件产生明显影响。
如果你等到设计完美,你就永远无法实现任何有用的东西。
答案 2 :(得分:2)
一般情况下,尝试让您的实体解决问题,但在事实发生之后添加字段,索引等并不是什么大不了的事。重构实体以支持不同的基数更为复杂。
乍一看,有几件事情爆发...... 1.练习表中所有这些编号的字段。巨大的红旗。我马上就会重构它。 2.徽章 - > userbadges。即使您对名称强制执行唯一约束,我仍然会为该表创建一个新的PK(一个id)。 3.我还需要一些时间来规范你的id字段的命名(即在用户中,你使用'userid'但在食物中,你使用'id'而不是'foodid')。你选择哪种方式是一个选择问题,但要尽量保持一致。
答案 3 :(得分:2)
“完美的SQL数据库”的问题在于,SQL缺乏超越某个微不足道的“完美数据库”的能力。
但是,听听你的老师并让Codd自豪(3NF / BCNF等等)。稍后添加缓存或临时非规范化数据(性能,需要时)等比尝试修复充满坏数据的数据库要容易得多。数据想要爱。喜欢它。
在这里说的是我要指出的一些事情:
exercise
看起来错误,错误,错误 - secondary1,secondary2,secondaryN ......不,谢谢!我不会像这样离开架构!
userid
是PK(varchar),但usernumber
是int?再次,不,谢谢。这似乎与其他表格的格式不同(大多数是id
),并且应该提示某些内容可能不正确。也许userid
(或username
?)应该只有一个唯一约束(您也可以将索引添加到其他列中 - PK通常在单调递增值时“效果最好”,尽管DB应该有一个-index计划表。)
命名不一致(userid
vs usernumber
vs id
)。不用了,谢谢。我不在乎你选择什么 - 但请一贯做到。
我的快速回顾。 快乐的发展。
答案 4 :(得分:1)
看起来很不错......除了你的exercise
表。 secondary1
到secondary10
字段可能会出现在不同的表格中。但是,你在其他地方做得很好,所以也许这是有道理的吗?考虑一下并确保。
完美并不重要,事情可以(并且会)在你完成后改变。尝试尽可能地降低标准化(你已经完成了这个)。字段大小可以更改,不用担心。
答案 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)
答案 9 :(得分:0)
你的设计看起来很不错!
现在最重要的是走出你的用例和用户对话框,看看是否所有流都很容易支持。
完美的用户体验比完美的数据库更重要。