不在数据库中的表上的外键,使用 ORM
Posted
技术标签:
【中文标题】不在数据库中的表上的外键,使用 ORM【英文标题】:foreign-key on a table not in the database, with ORM 【发布时间】:2010-12-27 13:20:32 【问题描述】:我有一个静态表 entry
由多个数据库/网站共享。静态,我的意思是数据被网站读取但从未更新。目前,所有网站都由同一台服务器提供服务,但这可能会发生变化。
我想尽量减少为每个网站创建/维护此表的需要,因此我考虑将其转换为存储在所有网站都可以访问的共享库中的变量。
问题是我使用 ORM 并使用外键约束来确保从该静态表中使用的 id 的引用完整性,所以通过将该表从 mysql 数据库中删除到一个变量中,如何我还能获得从该表引用的 id 的引用完整性吗?我是否必须完全以编程方式完成它,或者是否有一个技巧仍然可以将数据视为来自真实的数据库表。
我的数据库定义(使用 Propel)最初看起来像这样,其中 refer
表有一个字段 linkto
引用 entry
表的 id
。现在entry
表在代码中,我不能再使用外键技巧了,或者我能以某种方式获得相同的效果吗?
<table name="entry">
<column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" />
<column name="title" type="VARCHAR" size="500" required="true" />
</table>
<table name="refer">
<column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" />
<column name="linkto" type="INTEGER"/>
<foreign-key foreignTable="entry">
<reference local="linkto" foreign="id" />
</foreign-key>
</table>
当然,这些还有其他有效的方法来做同样的事情吗?我只是不想为多个网站重复该表。
【问题讨论】:
【参考方案1】:您可以创建一个约束——如果您的id
FK 被链接替换,则可能是一个非常冗长的约束——但是您仍然可以为每个网站维护这个约束。如果您需要其他处理方式的建议,了解这些表实际跟踪/用于什么会有所帮助。
【讨论】:
看起来 SO 没有显示我的表定义,即使我在帖子中有。我已将其突出显示为代码,所以现在它正在显示。希望这能澄清一点。 @sami - 知道它的用途仍然会有所帮助。以上是关于不在数据库中的表上的外键,使用 ORM的主要内容,如果未能解决你的问题,请参考以下文章
原因:java.sql.SQLException:无法删除表“投票”上的外键约束“FK336ctjyksuuwnpmffcogcdyet”引用的表“链接”