如何让 FORM 与 2 个单独的数据库一起工作,而表中没有定义外键?
Posted
技术标签:
【中文标题】如何让 FORM 与 2 个单独的数据库一起工作,而表中没有定义外键?【英文标题】:how can i get ORM to work with 2 separate databases without foriegn keys defined in the tables? 【发布时间】:2010-07-01 00:03:25 【问题描述】:我什至不确定这是否可能。我正在使用 Kohana 框架(2.3 版)。我有 2 个独立的数据库。一个称为“员工”,另一个称为“跟踪器”。数据库用于 2 个不同的网站。我想在跟踪器数据库中删除一个名为“csr”的表,其中包含相同的员工数据,并将跟踪器链接到员工数据库中的员工信息。
在我的跟踪器应用程序中,我有一个员工模型设置,它引用了外部“员工”数据库。我可以从跟踪器应用程序中使用 ORM 查询它,一切都很好。员工的唯一键是“id”。
在我的跟踪器数据库中,我有一个包含大约 12k 条目的“记录”表模型。没有一个字段名称对应于员工数据库中的员工表中的任何字段名称,但某些字段确实包含相同的信息。 “记录”的唯一键是 Transaction_Number
请注意,我没有编写此应用程序或设计数据库。我正在尝试“改造”跟踪器应用程序以使用现在集中的员工数据。
“记录”中有 9 个字段包含员工数据库中的匹配信息。这 9 个字段包含员工 ID 和姓名,但并非都是相同的 ID。
如果有帮助,我可以更改这 9 个字段中的数据,以便它们都是员工 ID,但我需要能够根据这 9 个字段中的任何一个中的 ID 获取员工数据:姓名、地址等字段
重新设计数据库会导致跟踪器应用程序的重写,我真的没有时间做所有这些。
为了节省阅读时间,我没有在此处包含表结构,但如果需要,我可以添加它们。
如何将这两个表链接在一起?
编辑:为 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
employee 表使用 ORM_Tree 进行自相关。
我需要能够获取任何这些字段的员工信息。我可以将每个字段中的数据更改为员工 ID,我想我可以消除其中的一些。我唯一需要的是supervisor(employee->id)、eid(employee->id)和csrfollow(可以更改为employee->id)。可以根据员工-> id 发现其他字段。我仍然需要让这 3 个字段指向员工数据库中的employee.id 字段。
【问题讨论】:
【参考方案1】:您是否知道 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;
你只需要用它的数据库名称来限定引用的表名。
关于您的更新:您可以使用属于 TRACKER 的不同数据将 RECORDS 的名称更改为 RECORDS_BASE。
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
然后创建一个名为 RECORDS 的新 VIEW,将 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 列中的内容。是谁的名字?无论如何,我会让你决定。我已经展示了如何获得对雇员表中每个相关行的引用,所以请选择。
【讨论】:
我知道这一点,但没有尝试,因为我认为这并不真正适用于我正在尝试做的事情。我正在更新问题以提供表格设计并解释关系应该是什么。 谢谢比尔。这适用于加入 2 张桌子,对我来说是一个很好的临时解决方案。我最终将需要重新设计数据库并重写大约 1/2 的现有代码以产生所需的行为。虽然这不是优先事项,但我再次感谢您。以上是关于如何让 FORM 与 2 个单独的数据库一起工作,而表中没有定义外键?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Flow 与 Vue 2 (webpack) 一起正常工作?
如何让 CORS 与 ASP.Net Core Web API 服务器 Angular 2 客户端一起工作
如何让 react-hot-loader 与 webpack 2 和 webpackDevMiddleware 一起工作?