需要输入数据模型设计
我 parent_table 为
id (PK)
current_version
latest_child_id
child_table 为
id (PK)
parent_table_id (FK to parent)
version (running number . largest number implies latest child record)
parent_table与child_table之间的关系为1:m。 另外,parent_table保留一个指向子表中记录的最新版本的指针。
系统会将n个可变行插入child_table并更新parent_table以指向最新版本 - 以便更快地读取。
我的问题是:
有问题的数据库: MySQL
答案 0 :(得分:2)
让parent_table存储最新版本的子表是不好的做法吗?
像“不良习惯”这样的短语会加载上下文。我更倾向于考虑权衡,并理解该级别的决策。 通过存储您可以另外计算的属性,您正在进行denormalization。这是处理性能挑战的既定方法 - 但它只是其中之一。权衡取舍大致如下。
在您的情况下,我怀疑您需要将此数据存储为非规范化属性。通过在parent_table_id, version DESC
上创建索引,即时检索此数据的速度太快(假设您的数据库拥有数百万条记录,而不是数十亿条记录)。
一般情况下,我建议只在以下情况下进行非规范化:
我是否在研究潜在的性能问题\锁定问题?因为任何插入子表 - 也需要在父表上锁定?
正如@TheImpaler所写,可能没有。但是,它取决于插入逻辑的复杂性(它是否会执行任何可能减慢速度的复杂计算?),以及几个并发线程尝试更新父记录的可能性。在这些情况下,您可能还会得到不一致的数据。
答案 1 :(得分:2)
ORDER BY child_id DESC LIMIT 1
是一种非常有效的方式来获得最新的"孩子(假设你有INDEX(child_id)
)。
这消除了对顽皮"多余"的需要。你提出的信息。
答案 2 :(得分:1)
- 让parent_table存储子表的最新版本是不好的做法吗?
醇>
不,如果它符合您的应用要求,那就完全没问题。您需要添加额外的逻辑来正确更新表,但就是这样。数据库为您提供了一系列存储数据和关系的可能性,这是一个非常好的选择。
- 我是否在研究潜在的性能问题\锁定问题?因为任何插入子表 - 也需要在父表上锁定?
醇>
这取决于您更新/插入/删除孩子的频率。考虑到当前的数据库服务器,除非变化率超过每秒200+,否则很可能不会出现问题。独占锁定可能成为大量交易的问题。
通常锁会在行级别。它,它们将仅锁定您正在使用的行,因此具有不同父项的多个线程不会产生瓶颈。
如果您的系统确实需要高级别的交易(1000+ /秒),那么我看到的选项是: