Mysql 具有状态和类型数据库的关系数据库设计
我目前正在使用一个由我的团队中的其他人设计的数据库,他使用了一种我以前从未遇到过的数据库设计风格。我想知道下面的设计是否是一个好的实践,因为它对我来说有点麻烦 有一个包含用户和业务特定信息的“正常”数据库。对于此数据库中的“类型”,例如Mysql 具有状态和类型数据库的关系数据库设计,mysql,database,database-design,referential-integrity,Mysql,Database,Database Design,Referential Integrity,我目前正在使用一个由我的团队中的其他人设计的数据库,他使用了一种我以前从未遇到过的数据库设计风格。我想知道下面的设计是否是一个好的实践,因为它对我来说有点麻烦 有一个包含用户和业务特定信息的“正常”数据库。对于此数据库中的“类型”,例如用户,在两个单独的数据库中存在一个表,即状态和类型 用户的状态只是一个名称和描述(例如活动或已删除) users的类型对我来说并不清楚,但该表由名称、描述、子集和级别字段组成 最麻烦的部分是这些表的链接,因为它们存在于不同的数据库中,user表需要状态和类型的键(
用户
,在两个单独的数据库中存在一个表,即状态
和类型
用户的状态只是一个名称和描述(例如活动或已删除)
users
的类型对我来说并不清楚,但该表由名称、描述、子集和级别字段组成
最麻烦的部分是这些表的链接,因为它们存在于不同的数据库中,user
表需要状态和类型的键(不能通过外键强制执行)
如果有一个简单的布尔字段来指示用户是否处于活动状态,对于类型,如果有任何不太可能的情况,那么使用继承不是更好吗 这些用户可能是初学者,因此您可以决定是否在代码中签入了用户状态,例如,当您登录if query时,有以下内容:
where status='active'
或类似的内容,因此在这种情况下,您不需要表,用户状态是静态值,可以包含在源代码中,此外,如果系统支持多语言,则应考虑这些状态的语言。与类型字段相同
但如果您不需要在代码中检查这些标志,那么将它们保留在表中是没有问题的,但在这种情况下,最好让用户能够在这之后添加类型或状态 这些用户可能是初学者,因此您可以决定是否在代码中签入了用户状态,例如,当您登录if query时,有以下内容:
where status='active'
或类似的内容,因此在这种情况下,您不需要表,用户状态是静态值,可以包含在源代码中,此外,如果系统支持多语言,则应考虑这些状态的语言。与类型字段相同
但如果您不需要在代码中检查这些标志,那么将它们保留在表中是没有问题的,但在这种情况下,最好让用户能够在这之后添加类型或状态 我认为你的问题涉及两个不同的方面: 1)数据内聚性和完整性-引用来自其他表的数据,这些表可以在同一数据库中,也可以不在同一数据库中 2)规范化-我需要其他表中的状态和类型,还是可以将它们合并到同一个表中 1) 如果您没有处理大量数据(至少数千万条记录),我建议您在“正常”数据库中复制
状态
和类型
表。如果数据很少更改,则特别建议这样做
这样做可以应用引用约束(FKs),还可以更快地连接
2) 尽管它增加了一些复杂性(额外的表、定义约束等),但将数据规范化可能会带来一些重要的优势:
- 灵活性—如果添加了状态或类型,则只意味着在表中进行简单的插入
- 较小的表-
表仅存储状态和类型的一些ID,而不存储字符串或难以猜测的值(例如0-非活动、1-活动等)用户
- 更易于维护-是否更改了类型名称?只需更新表中的记录
- 可操作(大量
s、插入
s、更新
s旁边的删除
s)选择
- 报告(主要是
s)SELECT
destination-heavyETL
s、INSERT
s等UPDATE
- 我认为你的问题涉及两个不同的方面:
1)数据内聚性和完整性-引用来自其他表的数据,这些表可以在同一数据库中,也可以不在同一数据库中
2)规范化-我需要其他表中的状态和类型,还是可以将它们合并到同一个表中
1) 如果您没有处理大量数据(至少数千万条记录),我建议您在“正常”数据库中复制
状态
和类型
表。如果数据很少更改,则特别建议这样做
这样做可以应用引用约束(FKs),还可以更快地连接
2) 尽管它增加了一些复杂性(额外的表、定义约束等),但将数据规范化可能会带来一些重要的优势:
- 灵活性—如果添加了状态或类型,则只意味着在表中进行简单的插入
- 较小的表-
表仅存储状态和类型的一些ID,而不存储字符串或难以猜测的值(例如0-非活动、1-活动等)用户
- 更易于维护-是否更改了类型名称?只需更新表中的记录
- 可操作(大量
s、插入
s、更新
s旁边的删除
s)选择
- 报告(主要是
s)SELECT
desETL