原则:如何保持 id 的唯一性



我面临的问题是,我不能强迫教义为新对象发布新的ID。例如:

/**
 * Something
 *
 * @ORMTable(name="something")
 * @ORMEntity
 */
class Something
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer", nullable=false)
     * @ORMId
     * @ORMGeneratedValue(strategy="IDENTITY")
     */
    protected $id;
}

显然会生成唯一的 ID - 但是当对象稍后被删除时,该 ID 将用于以后生成的对象。这是不幸的,因为可能存在引用该id的链接,这些链接现在指向错误的对象,而不仅仅是失败。

当直接在数据库上没有原则的情况下工作时,我正在使用autoincrement并且它按预期工作。然而,使用学说来管理表格似乎行不通。

使用 strategy="UUID" 很有帮助,而且通常是更好的选择,但有时这是不可行的。例如,捆绑包 FOSUserBundle 似乎依赖于用户 id 的整数。这基本上意味着 a) 永远不要删除用户,而只是停用它们,或者 b) 向其添加另一个 id/密钥(对于依赖该人工 ID 的关系来说非常笨拙)。

是否可以强制使用新的整数 ID?(让FOSBundle使用UUID的方法会很好,但我认为这是无法实现的。

目前在OS X上的symfony 3.1.2中使用sqlite的2.5.4原则 - 但生产服务器将基于Linux。在 PHP 7.0 上运行。

Doctrine 应该

根据 Doctrine 文档将GeneratedValue(strategy="IDENTITY")映射到 sqlite 数据库上的AUTOINCREMENT,因此没有 Doctrine 的尝试应该没有区别。

事实上,具有AUTOINCREMENT的标识列只有在生成生成的数字的事务被回滚时,才应重用生成的数字(请参阅 https://sqlite.org/autoinc.html)。在这种情况下,不应在其他条目中使用该数字,因为它们也应回滚。

所以我认为使用GeneratedValue(strategy="IDENTITY")没有问题,至少如果你使用事务。

编辑

Doctrine2 中存在一个错误,该错误阻止GeneratedValue(strategy="IDENTITY")正常工作,但存在一种解决方法,该解决方法为onSchemaCreateTable事件注册EventSubscriber。它创建正确的 sql 以生成主键列上具有AUTOINCREMENT属性的表。

最新更新