Как мне управлять своими отношениями «многие ко многим»? - PullRequest
3 голосов
/ 04 апреля 2010

У меня есть база данных, содержащая пару таблиц: файлы и пользователи.Это отношение «многие ко многим», поэтому у меня также есть таблица с именем users_files_ref, в которой хранятся внешние ключи обеих таблиц.

Вот схема каждой таблицы:

files ->file_id, имя_файла

users -> user_id, user_name

users_files_ref -> user_file_ref_id, user_id, file_id

Я использую Codeigniter для создания приложения для размещения файлов, и я 'м прямо в середине добавления функциональности, которая позволяет пользователям загружать файлы.Вот где я сталкиваюсь со своей проблемой.

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

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

Я новичок в реляционных базах данныхно некоторое время был в PHP, поэтому, пожалуйста, потерпите меня здесь: -)

У меня правильно настроены первичные и внешние ключи для таблиц files, users и users_files_ref, мне просто интересно, какуправлять добавлением файловых записей для этого сценария?

Спасибо за любую предоставленную помощь, она очень ценится.

-Wes

Ответы [ 3 ]

1 голос
/ 05 апреля 2010

Используйте $this->db->insert_id(), чтобы получить идентификационный номер строки, которую вы только что вставили. Дополнительная документация здесь: http://codeigniter.com/user_guide/database/helpers.html

0 голосов
/ 04 апреля 2010

Вы в основном описываете, как это обычно делается, с одной важной настройкой: как вы извлекаете file_id файла, чтобы иметь возможность добавить его в users_files_ref.

Обычно в среде базы данных у вас есть много клиентов, соединяющихся одновременно, и выполняющих обновления одновременно. В такой среде вы не можете просто получить file_id последнего добавленного файла - это может быть кто-то, кто добавил файл между вашими вызовами БД. Вы должны использовать функциональные возможности базы данных, чтобы получить сгенерированный идентификатор (например, SELECT @@IDENTITY на MSSQL) или как-то сгенерировать идентификаторы в коде приложения.

0 голосов
/ 04 апреля 2010

Я думаю, что вам нужно только это:

                   ----primary key-----
users_files_ref -> | user_id, file_id |

То, как вы получите file_id, зависит от кода, который вы реализуете. Ваши рассуждения верны. У вас уже есть user_id, и вам просто нужно получить file_id. С этими значениями вы можете добавить новую строку в user_files_ref.

Когда мне нужно это сделать, у меня обычно есть хранимая процедура с помощью последовательности, которая вставляет файл и возвращает последовательность NEXTVAL в качестве вывода. Это может быть способ реализации такого ценарио.

Это код для хранимой процедуры на основе Oracle:

CREATE OR REPLACE PROCEDURE SP_IMPORT_FILE(FILE    IN  FILE.FILE%TYPE,
                                           FILE_ID OUT NUMBER)

IS

BEGIN

  SELECT SEQ_FILE.NEXTVAL INTO FILE_ID from DUAL;

  INSERT INTO FILE (FILE_ID, FILE) VALUES (FILE_ID, FILE);

END SP_IMPORT_FILE;
...