Mysql 第一个具有引用完整性约束的数据库--建议、反馈、错误?

Mysql 第一个具有引用完整性约束的数据库--建议、反馈、错误?,mysql,database,database-design,rdbms,referential-integrity,Mysql,Database,Database Design,Rdbms,Referential Integrity,TARGET\u RDBMS:MySQL-5.X-InnoDB(“X”等于当前稳定版本) 背景:在创建“真正的”DDL之后,为了获得反馈,我用真正的引用完整性约束构建了我的第一个数据库,我已经做了一个抽象,我相信它涵盖了数据库的“感觉”;这只有3个表,大约20个,都有引用完整性约束;我看到缺少的唯一模式是一个复合键表,它现在没有要转储的数据,所以我只关注第一次迭代 样本数据/单元测试:我不知道的一件事是如何构建一个样本数据集,该数据集将提供100%的引用完整性覆盖率,并围绕该样本数据和该DDL构

TARGET\u RDBMS:MySQL-5.X-InnoDB(“X”等于当前稳定版本)

背景:在创建“真正的”DDL之后,为了获得反馈,我用真正的引用完整性约束构建了我的第一个数据库,我已经做了一个抽象,我相信它涵盖了数据库的“感觉”;这只有3个表,大约20个,都有引用完整性约束;我看到缺少的唯一模式是一个复合键表,它现在没有要转储的数据,所以我只关注第一次迭代

样本数据/单元测试:我不知道的一件事是如何构建一个样本数据集,该数据集将提供100%的引用完整性覆盖率,并围绕该样本数据和该DDL构建“单元测试”:

示例DLL: (注意:为了清楚起见,图例和命名标准仅适用于此示例,我从“真实”中抽象出来)数据库。列名本质上是机器人,旨在使给定实例的含义和关系尽可能清楚。如果您对使用的符号系统有任何建议,请随时发表意见。我愿意接受任何建议。谢谢!)

问题: 欢迎任何关于缺失、错误或“更好”的数据库构建方法的反馈。如果你有问题,请发表评论,我会尽快回复。再次感谢~

更新(1):
刚刚在PKs中添加了“MEDIUMINT NOT NULL AUTO_INCREMENT”——不确定我是如何取消它的

首先,我要为你定义的标准鼓掌。它对你的帮助是永无止境的

话虽如此,我还是有一些非常主观的看法:

我不喜欢在名称中嵌入类型信息,例如“TABLE\u PERSON”或“PERSON\t”,因为当您用视图替换表时,它会变得混乱。在这一点上,您当然可以搜索“PERSON\u T”并将其替换为“PERSON\u VW”,但它有点忽略了要点:) 列也是如此(尽管我在您的示例中看不到这一点)。想想“n_is_dead”列,它从numeric变为varchar

表中是否可以存在未创建的行(创建时间戳)?如果列确实不能为NULL,则将其声明为notnull。事实上,我开始在我的大多数列上使用NOTNULL,因为它使我更难思考数据的性质

我喜欢将主键列命名为ID以外的其他名称

company(company_id, etc)
person(person_id, company_id, firstname etc)
我听说有些人对O/R映射程序有问题,他们希望您始终使用名为“ID”的主键,但我不知道这是否仍然正确,最近是否发生了变化

我不清楚您是否打算在列名中嵌入(s、n、c)以指示它们是代理键、自然键还是公共键。但我也不认为这是个好主意。我觉得这会“揭示”一些不符合逻辑模型的实现细节

看起来您正在列名中公开/嵌入外键关系。我从来没有想过这一点,但我想你会对此深感遗憾。如果不仅仅是因为它让列名难看得让人无法忍受:)

为索引选择名称时。我唯一后悔给索引命名的时候是当我查看执行计划时,看到使用了“index_01”。我总是希望我把列名放在索引中,使它在xplan中可见。我不知道索引名的限制,但我总是遇到Oracle的限制。所以,试着想出一些关于如何缩写表名的规则。列名在这里很重要


关于混合情况。我总是(没有例外)选择全大写或全小写。原因是,在过去,当在数据库之间迁移查询时,当它们以不同的方式处理案例时,我被烧死了。最近,我使用了所有小写字母,因为我们编辑器的典型字体使小写字母比大写字母更容易发现拼写错误。当我在某些事情上失败时,编辑似乎并没有对我大喊大叫;)

@Ronnis:谢谢,“在名称中嵌入类型信息”只是用于示例抽象;意思我希望它尽可能抽象而不失去意义,并尽可能清楚地说明我对代码本身含义的理解。很明显,像TABLE_03_nID_FK___02_sID_PK这样的东西很难读懂,但我记不清有多少次我看到了DDL抽象或真实,我不知道给定元素的含义或关系是什么。@Ronnis:还有,仍然在查看您的反馈,但只是想说声谢谢,这对我获得反馈意义重大。这意味着,即使有人看了代码,对我来说也会有很大的不同,因为我是一个“牛仔程序员”,没有获得反馈的内部手段。@Ronnis:“事实上,我开始在我的大多数专栏上都没有空值,因为这让我更难思考数据的性质。”首先,我在任何地方都读过它,我很喜欢这个概念,因为很明显,你不能让所有字段都默认为空。谢谢你的指针。@Ronnis:“我听说有些人对O/R映射程序有问题,他们希望你一直使用名为“ID”的主键,但我不知道这是否仍然正确,最近是否发生了变化。”很有趣,因为我的下一步可能是选择一个带有ORM的应用程序框架。如果可能的话,完全同意不要在PK中只使用ID,但经验水平也非常有限。在处理复杂查询时,使用ID是一个糟糕的选择,因为当somone复制联接并更改表名但未更改联接条件中的别名时,它可能会导致不正确的结果。当您可能需要返回6个同名列时,进行报告也是一件痛苦的事情。
company(company_id, etc)
person(person_id, company_id, firstname etc)