MySQL中的父子关系设计

MySQL中的父子关系设计,mysql,sql,database,database-design,data-modeling,Mysql,Sql,Database,Database Design,Data Modeling,需要输入数据模型设计 我有家长表作为 id (PK) current_version latest_child_id id (PK) parent_table_id (FK to parent) version (running number . largest number implies latest child record) 子表 id (PK) current_version latest_child_id id (PK) parent_table_id (FK to paren

需要输入数据模型设计

我有家长表作为

id (PK)
current_version
latest_child_id
id (PK)
parent_table_id (FK to parent)
version (running number . largest number implies latest child record)
子表

id (PK)
current_version
latest_child_id
id (PK)
parent_table_id (FK to parent)
version (running number . largest number implies latest child record)
父_表与子_表之间的关系为1:m。 此外,父表还保留一个指针,指向子表中记录的最新版本

系统将在子_表中插入n个可变行,并更新父_表以指向最新版本,以便更快地读取

我的问题是:

  • 让父表存储最新版本是一种不好的做法吗 子表的版本
  • 我在看潜在的表现吗 问题\锁定问题?因为任何插入到孩子身上 表也需要父表上的锁吗
  • 有问题的数据库:MySQL

  • 让父表存储子表的最新版本是一种不好的做法吗
  • 不,如果它符合应用程序的要求,那就完全可以了。您需要添加额外的逻辑来正确更新表,但仅此而已。数据库为您提供了一系列存储数据和关系的可能性,这是一个非常好的选择

  • 我是否在考虑潜在的性能问题\锁定问题?因为任何插入子表的操作都需要父表上的锁
  • 这取决于更新/插入/删除子项的频率。考虑到当前的数据库服务器,这很可能不会成为问题,除非更改速率超过每秒200+以上。独占锁定可能会成为大量事务的问题

    通常锁位于行级别。这样,它们将只锁定您正在使用的行,因此具有不同父线程的多个线程不会造成瓶颈

    如果您的系统确实需要高水平的事务(1000+/秒),那么我看到的选项有:

    • 投入更多的硬件:最简单的方法。只要买一台更大的机器,问题就解决了。。。至少在一段时间内,直到您的系统再次增长
    • 使用乐观锁定:这种策略根本不需要执行任何实际的锁定。但是,您需要添加一个额外的数字列来存储行的版本号
    • 切换到另一个数据库:MySQL可能无法很好地处理非常大的容量。如果是这样的话,你可以考虑PostgreSQL,甚至是Oracle数据库,它肯定有更好的缓存技术,但也非常昂贵。
  • 让父表存储子表的最新版本是一种不好的做法吗
  • 不,如果它符合应用程序的要求,那就完全可以了。您需要添加额外的逻辑来正确更新表,但仅此而已。数据库为您提供了一系列存储数据和关系的可能性,这是一个非常好的选择

  • 我是否在考虑潜在的性能问题\锁定问题?因为任何插入子表的操作都需要父表上的锁
  • 这取决于更新/插入/删除子项的频率。考虑到当前的数据库服务器,这很可能不会成为问题,除非更改速率超过每秒200+以上。独占锁定可能会成为大量事务的问题

    通常锁位于行级别。这样,它们将只锁定您正在使用的行,因此具有不同父线程的多个线程不会造成瓶颈

    如果您的系统确实需要高水平的事务(1000+/秒),那么我看到的选项有:

    • 投入更多的硬件:最简单的方法。只要买一台更大的机器,问题就解决了。。。至少在一段时间内,直到您的系统再次增长
    • 使用乐观锁定:这种策略根本不需要执行任何实际的锁定。但是,您需要添加一个额外的数字列来存储行的版本号
    • 切换到另一个数据库:MySQL可能无法很好地处理非常大的容量。如果是这样的话,你可以考虑PostgreSQL,甚至是Oracle数据库,它肯定有更好的缓存技术,但也非常昂贵。
    让父表存储子表的最新版本是一种不好的做法吗

    像“坏习惯”这样的短语有很多上下文。我更愿意考虑权衡,并理解在这个层面上的决定。 通过存储一个可以通过其他方式计算的属性,您可以执行以下操作。这是一种处理性能挑战的既定方法,但它只是其中之一。权衡大致如下

    • 负面:占用更多存储空间。假设这不重要
    • 否定:需要更多的代码。更多的代码意味着更多的bug机会。考虑在测试套件中封装数据访问代码。
    • 否定:非规范化模式可能需要额外的“大脑空间”-您必须记住,您计算(例如)父级拥有的子级数量,但通过查看父表中的属性来查找最新的子级。在理想情况下,规范化模式描述业务上下文,而不必记住实现细节
    • 负面:可能会使您的数据模型在将来更难扩展。随着您添加更多的实体和属性,此非规范化表可能越来越难以保持同步。一个非规范化列通常很容易使用,但是如果有很多非规范化列,那么要使它们都保持最新可能非常困难
    • 负面:对于不经常访问的数据,非规范化设计可能比动态计算对性能的影响更大。你的问题2就是一个例子。在复杂的场景中,多个线程可能会在非规范化数据中产生不一致
    • 正面:数据经常被读取,并且