抽象出数据库表是否合理?

Is it reasonable to abstract out database tables?

我维护一个有很多模块的应用程序。这些模块中的每一个都可以对其项目进行评论。例如,包含评估的“评估”模块、包含项目的“项目”模块和包含调查结果的“调查结果”模块。

目前,我对其中的每一项都有一个“评论”table。示例 table 列表:

assessments
assessments_comments (id, assessment_id, comment)
projects
projects_comments (id, project_id, comment)
findings
findings_comments (id, finding_id, comment)

将评论抽象为一个 table 有意义吗?例如:

assessments
projects
findings
comments (id, entity, entity_id, comment) i.e.(1, 'assessments', 1, 'this is a comment')

我认为我永远不需要应用程序中所有评论的列表。一般来说,在考虑抽象时有哪些好的问题要问?

我认为您没有进行足够彻底的需求分析 yet/a 单个 comment 字段似乎不足以说明业务用户通常记录评论的原因。但是,如果它是用于探测您正在寻找的设计的:

id 是如何生成的?它们在所有模块中都是独一无二的吗?然后,无论您从哪里生成它们,都可能会遇到较差的并发特性。

assessment_id, project_id, finding_id是同一类型吗?每个 _id 在所有模块中都是唯一的吗?然后,您将再次遇到 concurrency/contention 生成它们的困难。

难道projects等'natural keys'不是由用户决定的,而是人工生成的代理键吗?你不应该用自然键索引所有东西吗?然后是相同的问题:每个模块中那些不同的自然键类型是否相同? (这似乎很难相信。)试图将它们粉碎成 cross-module 索引是自找麻烦。