2010-03-07 2 views
3

Может кто-нибудь дать демо?Как связать две таблицы без внешнего ключа?

Я использую MySQL, но идея должна быть такой же!

EDIT

На самом деле я спрашиваю в чем разница между Doctrine_Relation и Doctrine_Relation_ForeignKey в доктрине?

+0

Приведите некоторые детали к таблицам и полям, о которых идет речь. Обычно вы можете обойти это с помощью хорошей комбинации конкатенации и использования подстроки. – CheeseConQueso

+0

Что вы подразумеваете под «relate» - для инструкции SELECT или данных модель отношений? –

+0

OMG Ponies, отношение модели данных – user198729

ответ

1

Вы должны использовать внешние ключи для связывания таблиц в MySQL, поскольку он не предлагает других способов создания связей (таких как ссылки или вложенные таблицы в объектно-ориентированной базе данных).

См: http://lists.mysql.com/mysql/206589

EDIT: Если вы готовы использовать Oracle, ссылки и вложенные столы являются альтернативными способами для создания связей между таблицами. Ссылки более универсальны, так что вот пример.

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

Позволяет создать тип объекта работника, который имеет ссылку на его менеджер:

CREATE TYPE employee_type AS OBJECT (
     name  VARCHAR2(30), 
     manager REF manager_type 
); 

Мы должны также создать тип объекта для менеджеров:

CREATE TYPE manager_type AS OBJECT (
     name  VARCHAR2(30), 
); 

Теперь позволяет создать две таблицы, одна для сотрудников и других менеджеров:

CREATE TABLE employees OF employee_type; 
CREATE TABLE managers OF manager_type; 

Мы можем связать эти таблицы, используя refe rences. Для вставки сотрудника в таблице сотрудников, просто сделать это:

INSERT INTO employees 
    SELECT employee_type('Bob Jones', REF(m)) 
    FROM managers m 
    WHERE m.name = 'Larry Ellison'; 

Подробнее: Introduction to Oracle Objects

+0

MySQL не является обязательным, в качестве примера можно взять любые dbms – user198729

0

Ну можно обойти, что, заботясь о взаимоотношениях в языке на стороне сервера. Некоторые слои абстракции базы данных могут обрабатывать это для вас (например, Zend_Db_Table для PHP), но рекомендуется использовать внешние ключи.

У MySQL есть механизм хранения InnoDB, который поддерживает внешние ключи, а также транзакции.

2

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

Например, если db1.tableA имеет столбец L_Name и db2.tableB имеет столбец LastName, то совпадение строк будет вызывать одно измерение. Вы можете расширить это, сравнив значения в строках, чтобы проверить, есть ли некоторая согласованность, например, если значения в обеих таблицах содержат: «Смит», «Джонсон» и т. Д. У вас есть двойная победа.

Недавно я сделал нечто подобное, объединив несколько больших баз данных (один из них на другом языке - французский!), И это оказалось довольно большим опытом.

НТН

0

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

Столбец (или набор столбцов), который связывает две таблицы, является внешним ключом - даже если у него нет ограничения, определенного на нем (или даже индекса), и не является ни одним из основных (хотя в этом случае вы можете столкнуться со странной ситуацией, когда вы можете получить непреднамеренные декартовы продукты при присоединении, так как в итоге вы получите установленную связь, которая, вероятно, не такая, как вы хотите)

Не имея ограничение внешнего ключа не является препятствием для использования внешнего ключа.