Как я могу заставить ORM работать с 2 отдельными базами данных без ключей foriegn, определенных в таблицах? - PullRequest
3 голосов
/ 01 июля 2010

Я даже не уверен, возможно ли это.Я использую каркас Kohana (версия 2.3).У меня есть 2 отдельные базы данных.Один называется «сотрудники», а другой - «трекер».Базы данных используются на 2 разных сайтах.Я хочу исключить из базы данных трекера таблицу csr, которая содержит идентичные данные о сотрудниках, и связать трекер с информацией о сотрудниках в базе данных сотрудников.

В моем приложении для отслеживания у меня есть настройка модели длясотрудники, которые ссылаются на внешнюю базу данных сотрудников.Я могу запросить его с помощью ORM из приложения трекера, и все хорошо.уникальный ключ для сотрудников - «id».

В моей базе данных трекеров у меня есть модель таблицы «records» с примерно 12 тыс. записей.Ни одно из имен полей не соответствует никаким именам полей в таблице сотрудников из базы данных сотрудников, но некоторые поля содержат идентичную информацию.Уникальный ключ для «записей» - Transaction_Number

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

В «записях» есть 9 полей, которые содержат соответствующую информацию в базе данных сотрудников.Эти 9 полей содержат идентификаторы и имена сотрудников, но не все идентификаторы.

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

Редизайн базы данных может привести к перезаписи приложения для отслеживания, и у меня действительно нет времени, чтобы сделать все это.

Чтобы сохранить чтение, я не включаю здесь структуры таблиц, но могу добавить их при необходимости.

Что можно сделать, чтобы связать эти две таблицы вместе?

РЕДАКТИРОВАТЬ: Добавлена ​​структура таблицы для tracker.records

TRACKER.RECORDS
Transaction_Number (PK AI not null)
date
accountnumber
reasoncode
reasondesc
actioncode
actiondesc
comments
supervisor        -    employee->id (supervisor that created the record)
supername         -    employee->name
supersuper        -    employee->parent->name
superman          -    employee->parent->parent->name
eid               -    employee->id  (employee that the record is about)
Service_Rep       -    employee->name
ServRepSupervisor -    employee->parent->name
ServRepManager    -    employee->parent->parent->name
csrfollow         -    employee->name  (who to follow up with)
Important
Read
Followup_Read
followup_Important

таблица сотрудника использует ORM_Tree для самообращения.

Мне нужно иметь возможность получить информацию о сотруднике для любого из этих полей,Я могу изменить данные в каждом из этих полей на идентификатор сотрудника, и я думаю, что могу удалить некоторые из них.единственные, которые мне нужны - это supervisor (employee-> id), eid (employee-> id) и csrfollow (можно изменить на employee-> id).другие поля могут быть обнаружены на основе employee-> id.Мне все еще нужно, чтобы эти 3 поля указывали на поле employee.id в базе данных сотрудников.

1 Ответ

1 голос
/ 01 июля 2010

Знаете ли вы, что MySQL позволяет внешним ключам ссылаться на таблицы в разных базах данных, если обе базы данных размещены на одном и том же экземпляре MySQL?

CREATE TABLE `employees` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
  -- other columns...
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `records` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `employee_id` bigint(20) unsigned DEFAULT NULL,
  -- other columns...
  FOREIGN KEY (`employee_id`) REFERENCES `employees`.`employees` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Вам просто нужно указать имя ссылочной таблицы с помощьюего имя базы данных.


Re your update: Вы можете изменить имя RECORDS на RECORDS_BASE с различными данными, которые принадлежат TRACKER.

TRACKER.RECORDS_BASE
Transaction_Number (PK AI not null)
date
accountnumber
reasoncode
reasondesc
actioncode
actiondesc
comments
supervisor_id
eid
Important
Read
Followup_Read
followup_Important

Затем создайте новый VIEW с именем RECORDS, который присоединяет RECORDS_BASE к нескольким строкам в EMPLOYEES:

CREATE VIEW TRACKER.RECORDS AS
SELECT rb.*,
  s.id AS supervisor,
  s.name AS supername,
  ss.name AS supersuper,
  sss.name AS superman,
  emp.name AS Service_Rep,
  srs.name AS ServRepSupervisor,
  srm.name AS ServRepManager,
  ??? AS csrfollow
FROM TRACKER.RECORDS_BASE AS rb
JOIN EMPLOYEES.EMPLOYEES AS s ON rb.supervisor_id = s.id
JOIN EMPLOYEES.EMPLOYEES AS ss ON s.parent_id = ss.id
JOIN EMPLOYEES.EMPLOYEES AS sss ON ss.parent_id = sss.id
JOIN EMPLOYEES.EMPLOYEES AS emp ON rb.eid = emp.id
JOIN EMPLOYEES.EMPLOYEES AS srs ON emp.parent_id = srs.id
JOIN EMPLOYEES.EMPLOYEES AS srm ON srs.parent_id = srm.id;

Я не могу сказать из вашего описания, что принадлежит столбцу csrfollow.Чье это имя?В любом случае, я оставлю это на ваше усмотрение.Я показал, как вы можете получить ссылку на каждую из соответствующих строк в таблице сотрудников, так что выбирайте.

...