Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有状态和类型数据库的关系数据库设计_Mysql_Database_Database Design_Referential Integrity - Fatal编程技术网

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-活动等)

  • 更易于维护-是否更改了类型名称?只需更新表中的记录

如果设计得当(PKs、FKs、check约束等),规范化结构通常能说明问题本身,并允许分离关注点(将来可能会为用户类型实现设计器)

通常,应根据活动类型进行数据库分离:

  • 可操作(大量
    插入
    s、
    更新
    s、
    删除
    s旁边的
    选择
    s)
  • 报告(主要是
    SELECT
    s)
  • ETL
    destination-heavy
    INSERT
    s、
    UPDATE
    s等

    • 我认为你的问题涉及两个不同的方面:

      1)数据内聚性和完整性-引用来自其他表的数据,这些表可以在同一数据库中,也可以不在同一数据库中

      2)规范化-我需要其他表中的状态和类型,还是可以将它们合并到同一个表中

      1) 如果您没有处理大量数据(至少数千万条记录),我建议您在“正常”数据库中复制
      状态
      类型
      表。如果数据很少更改,则特别建议这样做

      这样做可以应用引用约束(FKs),还可以更快地连接

      2) 尽管它增加了一些复杂性(额外的表、定义约束等),但将数据规范化可能会带来一些重要的优势:

      • 灵活性—如果添加了状态或类型,则只意味着在表中进行简单的插入

      • 较小的表-
        用户
        表仅存储状态和类型的一些ID,而不存储字符串或难以猜测的值(例如0-非活动、1-活动等)

      • 更易于维护-是否更改了类型名称?只需更新表中的记录

      如果设计得当(PKs、FKs、check约束等),规范化结构通常能说明问题本身,并允许分离关注点(将来可能会为用户类型实现设计器)

      通常,应根据活动类型进行数据库分离:

      • 可操作(大量
        插入
        s、
        更新
        s、
        删除
        s旁边的
        选择
        s)
      • 报告(主要是
        SELECT
        s)
      • ETL
        des