假设我必须管理一些列表,每个列表中都有一些待办事项。
但是每个待办事项都可以与其他实体相关:比如说一个用户(调用它),或者一个文档(比如编辑它),或者任何其他由我的应用程序管理的实体。
我只看到两种解决方案来管理这些关系:
- 为每种关系类型使用一个单独的表(因此我会想出像
todo_users
、todo_documents
等表) - 在
todos
表中使用专用字段(因此我将拥有像too_id
、todo_list
、relates_to_user
这样的字段>,relates_to_document
, ecc.)
问题 #1:这两种解决方案在非常大的数据集上可能有不同的性能?或者它们是等价的?
问题 #2:我可以采用更好的方法吗?
Doctrine 不支持它,但是有没有办法建立一个todo-to-any
关系?
最佳答案
尝试以#2 方式存储东西迟早会导致困惑。您可能会遇到的一些问题(我敢肯定,还有一些我现在看不到或记不起的问题)
- 每次您需要添加与新实体的关系时,您都需要添加一列:一次只有一列是“重要的”,因为我想,只有一个 todo_list 可以属于另一个实体。
- (上述观点的直接后果)您需要“以编程方式”控制一次只有一列具有
true
值并且至少 strong> 一列具有true
值(如果您“绕过”您的应用程序 API 并直接转到 db(此处的relates_to_*
字段被视为指示外键“成员身份”的 bool 值;如果它们只是外键,则需要保证相同的约束,但不是true
值,而是替换not null
) - 如果
relates_to_*
是 bool 值,您需要存储一个带有外键的额外字段:这在原则(以及一般的 sql 中)中是不可能的,因为您不能声明引用更多的外键不止一张 table - 每条记录都有大量无用的“噪音数据”:如果此应用程序为 10 个用户运行,这根本不是问题,否则就是肯定的。
我建议看一下doctrine inheritance mappings :这是您问题的解决方案,直接从学说本身“在幕后”处理。
关于php - Symfony 和 MySQL/Doctrine : manage a todo lists with todos that may relate to many different entities: tables or fields or many-to-any?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43408730/