7

如果使用RedBean ORM,是否需要为数据库中的每个表添加一个名为“id”的主键?

在我的数据库中,我有一些表有 2 个或 3 个字段的主键对,或者主键的名称不是“id”(是的,我可以将名称更改为“id”,但它不会真正反映现实,因为它们不是 ID)

例子:

table1 - 存储帖子:

  id           INTEGER      PRIMARY KEY AUTOINCREMENT,
  name         TEXT,
  title        TEXT,
  content      TEXT,

table2 - 存储帖子的元数据:

  post         INTEGER      DEFAULT 0,     # <- references "id" from "posts"
  name         TEXT,
  value        TEXT,
  PRIMARY KEY(name, post),
  CONSTRAINT posts_meta FOREIGN KEY(post)
    REFERENCES posts(id) ON DELETE CASCADE ON UPDATE RESTRICT

RedBean 可以使用这种数据库结构吗?

4

2 回答 2

11

不幸的是,根据您当前的表结构,您无法使用 RedBean。每个表都需要有一个自增主键。略有下降,因为它使集成到现有产品中变得更加困难。

由于这个限制,一些线程未能使用 RedBean,作者 Gabor De Mooij 的回应是:

http://groups.google.com/group/redbeanorm/browse_thread/thread/6d5582275326744f?pli=1

http://groups.google.com/group/redbeanorm/browse_thread/thread/4fa7b29b453dcdb8

但是,RedBean 不需要将主键字段简单命名为“id”。您可以使用该formatBeanID()方法根据自己的喜好格式化主键列的名称,如下例所示,该方法有条件地将表名添加到“id”前面。例如)表users的主键是users_id。使用该格式,您可以根据需要获得尽可能详细的 id 名称。

http://redbeanphp.com/community/wiki/index.php/Prefixes

希望这种限制在未来会被解除,因为它确实阻碍了与现有产品的集成。

编辑:作为替代 ORM,我听说过 Doctrine: http: //www.doctrine-project.org/。我没有亲自使用过它,但它似乎是许多使用 PHP 的标准。

编辑 2:感谢 Jason 并感谢 Jason 提出了一种将 RedBean 集成到可能未为其设置数据库的现有项目中的新方法。我也想更新我的答案,以防人们仍然用这个问题引用它。Gabor 建议制作映射到表的视图,您可以在其中将视图设置为具有 RedBean 所需的适当结构。我没有亲自测试过,但它得到了一些用户的积极反馈。它在更改表时增加了一些额外的开销和维护,但似乎是迄今为止对这个问题的最佳和最完整的答案。 http://www.redbeanphp.com/faq#beanformatter

于 2012-03-06T19:42:42.093 回答
6

接受的答案并不完全正确......您可以使用现有的表结构 - 但您需要在每个表的顶部实现一个 VIEW ,允许您将 PKEY 列重命名为“id”...参见这封来自 Gabor 的电子邮件 - RedBeanPHP 的创建者:

https://groups.google.com/forum/#!searchin/redbeanorm/view/redbeanorm/wXUeT4Tj2uU/3AngnmVwZdYJ

于 2013-10-26T21:04:28.087 回答