Вставка SQL в форме AJAX - PullRequest
1 голос
/ 29 июня 2010

В базе данных, где есть отношение многие ко многим (например, скажем, 3 такие таблицы)

Book    |   Author    |    BookAuthor
_____   |   ______    |    __________
BookId  |   AuthorId  |    BookId
Title   |   Name      |    AuthorId
...     |   ...       |

Я хочу форму для создания новой книги. В этой форме пользователи вводят информацию о книге (название и т. Д.) И выбирают авторов для книги в одной форме.

В такой ситуации, когда вы делаете вставку в таблицу Book? Вы делаете это, когда:

  1. вы получаете доступ к форме, чтобы получить BookId и вставить его в таблицу BookAuthor, когда пользователь добавляет авторов?

  2. делать это только тогда, когда пользователь покидает форму (вы вставляете в Book, а затем в BookAuthor)?

С 1 вы можете получить кучу нежелательных записей, так как запись создается, даже когда пользователи покидают страницу или нажимают кнопку Отмена.

С 2 у вас нет BookId, поэтому вы не можете начать вставку в таблицу BookAuthor, пока не будет заполнена вся форма (тогда вы не сможете использовать AJAX).

Похоже, это будет довольно распространенный сценарий, поэтому я представляю, что есть правильный способ сделать это?

РЕДАКТИРОВАТЬ : Авторы могут быть добавлены, как теги, добавленные к вопросу о переполнении стека (поле автозаполнения), как это было предложено в ответе. Вы добавляете тег, но он не может быть вставлен сразу, потому что вопрос еще не существует в базе данных. Поэтому, когда вы отправляете свой вопрос, я предполагаю, что содержимое поля автозаполнения анализируется и что оба тега и вопрос вставляются одновременно. Я не знаю, как это делается на SO (синтаксический анализ или что-то еще), но это в основном то, что я пытаюсь выяснить.

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Я бы определенно не предложил № 1 по той причине, о которой вы говорили, и просто не имеет логического смысла.

Я бы предложил # 2 или эволюцию # 2.

Во-первых, мне интересно, почему вы хотите / должны делать это с AJAX - вопреки вашему окончательному утверждению, это, безусловно, возможно - но ваш упрощенный пример будет работать так же, как и простая отправка HTML-формы.

В любом случае, это зависит от того, как авторы созданы.Вы хотите разрешить пользователю создавать авторские записи одновременно или в дополнение к этому?(Я предполагаю последнее).

Если бы я занимался этим проектом, я бы, вероятно, хотел бы позволить пользователю создавать записи в книгах и выбирать из поля автозаполнения автора.Я также хотел бы позволить им создавать любые новые записи автора из этого поля.Например, если они введут имя автора, которого еще нет в таблице авторов, система создаст новую запись.

В случае, если запись автора еще не существует, вам потребуетсячтобы создать новый, который даст вам новый идентификатор автора.

После того, как вы получите свой идентификатор автора (либо из поиска по существующему, либо создав новый), вы можете создать свою запись в книге.,После того, как вы это сделаете, у вас будет идентификатор книги, после чего вы сможете добавить ссылку в BookAuthor.

Возможно, вы захотите обернуть все это в транзакцию, а затем зафиксировать после того, как запись BookAuthor будет выполнена.создал.

Возможно, вы захотите использовать столбцы автоинкремента для своих идентификаторов, и, возможно, вы захотите использовать ограничения внешнего ключа для столбцов идентификаторов при связывании с таблицей BookAuthor.

Все это в стороневы можете использовать AJAX для любого взаимодействия клиента с сервером - это всего лишь способ связи с сервером из браузера.

0 голосов
/ 30 июня 2010

Ваш вызов AJAX будет попадать на страницу, которая вставляется в таблицу Book , а затем вставляется в таблицу BookAuthor. Оба этих запроса будут выполняться внутри транзакции для поддержания целостности отношения первичного / внешнего ключа.

В зависимости от вашей базы данных BookID из вашей таблицы Book можно получить разными способами. Либо вы можете запросить его после вставки таблицы Book.

Выберите Макс (BookID) в качестве TheBookID из Книги

Или, если вы используете Oracle, вы можете сначала увеличить последовательность перед вставкой в ​​таблицу Book.

Выберите BookID_SEQ.nextval из двойного

Тогда вы можете использовать этот порядковый номер во вставке таблицы Book, а также на вкладке BookAuthor.

Все эти запросы должны вызываться в транзакции, хотя какой-то подлый не может проникнуть за вас и украсть ваш Макс (BookID) или увеличить вашу последовательность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...