如何在没有外键的情况下关联两个表?

时间:2010-03-07 21:49:14

标签: mysql database doctrine entity-relationship

有人可以演示吗?

我正在使用MySQL,但这个想法应该是一样的!

修改

事实上,我在问学说Doctrine_RelationDoctrine_Relation_ForeignKey之间的区别是什么?

4 个答案:

答案 0 :(得分:2)

我怀疑你正在看的是从一个db表到另一个db表的map列。您可以使用一些字符串比较算法来完成此操作像Levenstein或Jaro-Winkler这样的算法可以让你推断出“匹配”列。

例如,如果db1.tableA具有列L_Name并且db2.tableB具有LastName列,则字符串距离匹配将获取一个度量。您可以通过比较行中的值来扩展它,以检查是否存在某种一致性,例如,如果两个表中的值包含:“Smith”,“Johnson”等,您将获得双赢。

我最近做了类似的事情,整合了多个大型数据库(其中一个用不同的语言 - 法语!),结果证明这是非常棒的体验。

HTH

答案 1 :(得分:1)

您应该使用外键来关联MySQL中的表,因为它不提供其他方法来创建关系(例如面向对象数据库中的引用或嵌套表)。

请参阅: http://lists.mysql.com/mysql/206589

编辑: 如果您愿意使用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;

我们可以使用引用来关联这些表。要在employee表中插入员工,只需执行以下操作:

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

更多信息:Introduction to Oracle Objects

答案 2 :(得分:0)

嗯,你可以通过处理服务器端语言中的关系来解决这个问题。一些数据库抽象层可以为您处理(例如PHP的Zend_Db_Table),但建议使用外键。

MySQL有InnoDB存储引擎,支持外键和事务。

答案 3 :(得分:0)

使用外键是创建关系的标准方法。替代品几乎不存在,因为您必须识别相关的行SOMEHOW。

链接两个表的列(或列集)是一个外键 - 即使它没有在其上定义约束(甚至索引)并且不是表的主键之一(虽然在这种情况下你最终可能会遇到一种奇怪的情况,你加入时可能会得到意想不到的笛卡尔积,因为你最终会得到一套与你想要的设定关系,这可能不是你想要的)

没有外键约束是使用外键的障碍。