Yii:在多个表中引用行的最佳方法是什么?

时间:2011-02-05 19:12:52

标签: mysql oop database-design foreign-keys yii

参考任何型号记录的Yii最友好的“标准”方式是什么?

我正在尝试构建一个菜单系统,用户可以在其中创建一个链接到网站上另一个项目的菜单项。显然,用户可以链接到各种类型的内容(模型)。我想在不使用url作为内部参考的情况下工作,以便给予我更大的灵活性。

正如评论中提到的某种“统一主键”

我在考虑每个模型都是基础模型的扩展和参考,就像在this question中一样。或者只是为每个可以引用的模型创建一个单独的字段。

也许另一种方法是将模型和记录ID存储在一个字段中然后只是覆盖活动记录关系'魔术'

1 个答案:

答案 0 :(得分:1)

你要做的是一个棘手的问题,因为mySql只支持First Normal Form关系而不支持OOP继承。这称为“多态关联”。虽然有几个解决方案。可以在这里找到描述其中一些的非常好的答案:

Possible to do a MySQL foreign key to one of two possible tables?

一个可能的解决方案示例(我认为在上面的链接中列出的第二个示例)与Yii可能是一个带有“type”字段的“对象”表,然后将表与需要的字段分开其他类型的“对象”。然后在基础对象模型的afterFind()方法中,查看类型字段并将类型Behaviors附加到它们,以允许访问类型表列。

此外,如果您真的只想要一种更简单的方法来制作链接或短网址,您可以在框架中编写一些额外的功能,这些功能基本上只是简单地链接到对象。对于所有对象类型都有正常的单独模型,但是有一个带有主要主键(或URL slug)的中央表,它与各个类型有关系。您可以覆盖createUrl(),以便它只接受主密钥(无论内容类型如何),然后通过查找要在主表中使用的模型/控制器来构建正确的链接。

这是Drupal的URL别名允许您执行的操作。比重建Drupal CCK之类的系统更容易!除非你真的需要灵活地改变未来的内容,否则这将是不必要的。