Нужен ли RedBean первичный ключ id?

Если вы используете RedBean ORM, нужно ли вам добавлять первичный ключ с именем "id" в каждую таблицу вашей базы данных?

В моей БД у меня есть несколько таблиц, которые имеют пары первичных ключей из 2 или 3 полей или первичные ключи с именами, отличными от «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 работать с такой структурой базы данных?


person Alex    schedule 04.03.2012    source источник
comment
Насколько я знаю, он должен иметь id в качестве первичного ключа. Я пробовал это на таблицах без или с table_id, и это не сработало. Возможно, есть способ настроить его на работу, но я не пробовал.   -  person Tim Withers    schedule 04.03.2012


Ответы (2)


К сожалению, с вашей текущей структурой таблицы вы не можете использовать RedBean. Каждая таблица должна иметь первичный ключ с автоинкрементом. Небольшое падение, так как затрудняет интеграцию в уже существующий продукт.

Несколько потоков, которые не смогли использовать RedBean из-за этого ограничения, с ответами автора, Габора Де Муиджа:

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. Используя это форматирование, вы можете получить как можно более подробную информацию об имени идентификатора.

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

Будем надеяться, что это ограничение будет снято в будущем, так как оно действительно мешает интеграции в существующие продукты.

EDIT: В качестве альтернативы ORM я хорошо слышал о Doctrine: http://www.doctrine-project.org/. Я лично не использовал его, но, похоже, он является стандартом для многих, работающих с PHP.

РЕДАКТИРОВАТЬ 2: Спасибо Джейсону за то, что он обратил внимание на новый метод интеграции RedBean в существующий проект, для которого ваша база данных может быть не настроена. Я также хотел обновить свой ответ на случай, если люди все еще ссылаются на него с этой проблемой. Габор предложил создавать представления, которые сопоставляются с таблицами, где вы можете настроить представление так, чтобы оно имело правильную структуру, необходимую для RedBean. Я лично не проверял это, но некоторые пользователи получили положительные отзывы. Это добавляет некоторые дополнительные накладные расходы и обслуживание при изменении таблиц, но кажется лучшим и наиболее полным ответом на эту проблему на сегодняшний день. http://www.redbeanphp.com/faq#beanformatter

person king14nyr    schedule 06.03.2012
comment
Журнал изменений RedBeanPHP 3.0: ... Удален Bean Formatter, вы НЕ МОЖЕТЕ БОЛЬШЕ настраивать схему базы данных (потому что это ломает вещи) ... Я использую ReadBean v3.2, и что мне делать? - person Ivan Velichko; 12.09.2012
comment
@Ostrovski Если вы пытаетесь интегрировать RedBean в уже существующий проект/базу данных и вам нужны функции, предоставляемые BeanFormatter, я бы реализовал RedBean 2.2.3. Я не уверен, почему стоит отказаться от BeanFormatter... Кажется, RedBean движется к домену новых проектов, где вы реализуете его и базу данных рука об руку. Проверьте, можете ли вы реализовать 2.2.3, или если вы хотите/должны использовать 3.0+, почитайте, возможно, о повторной реализации этих классов, как предлагается в этом посте: groups.google.com/forum/?fromgroups=#!topic/redbeanorm/ - person king14nyr; 12.09.2012

Принятый ответ не совсем верен... Вы можете использовать существующую структуру таблицы, но вам нужно будет реализовать VIEW поверх каждой из таблиц, что позволит вам переименовать столбец PKEY в "id"... См. это электронное письмо от Габора — создателя RedBeanPHP:

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

person Jason    schedule 26.10.2013
comment
Судя по откликам на его предложение, это выглядит жизнеспособным решением. На самом деле это та же ссылка, которую я отметил в своем комментарии, похоже, что ветка остается активной, и Габор недавно предложил это потенциальное решение. Я отредактирую свой ответ, чтобы убедиться, что любой, кто заходит на эту страницу, не столкнется со старыми, устаревшими или неправильными советами. Спасибо за обновления! - person king14nyr; 11.12.2013
comment
Вы также можете использовать функцию exec(), чтобы делать все, что вам хочется. ID только для бинов, вы все равно можете вставлять в /update как хотите. - person Nick; 20.06.2016