注意。 Also posted on Database Administrators
我有一个表记录所有销售情况,还有十四个补充表,其中包含有关销售的额外信息。十四个补充表在所有意图和目的上都是相同的。它们创建于很久以前,当时最初的开发人员认为会有更多差异,但是实际上,由于该项目已经成熟,所以它们之间的相似性大于差异。但是它们是不同的,因此我需要将它们分开。
目前的结构
销售表
| id | customer_id | customer_ref | ... |
|---------|-------------|--------------------------------------|-----|
| 1237567 | 354 | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| 1237568 | 867 | ref89b72 | ... |
| ... | ... | ... | ... |
补充表1类别:App \ SuppOne
| id | customer_id | customer_ref | ... |
|------|-------------|--------------------------------------|-----|
| 2857 | 10372 | 2016-07-01-ab5d09cc37ca | ... |
| 2858 | 354 | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| ... | ... | ... | ... |
补充表2类:App \ SuppTwo
| id | customer_id | customer_ref | ... |
|-------|-------------|--------------|-----|
| 90488 | 867 | ref89b72 | ... |
| 90489 | 1024 | 0000080992 | ... |
| ... | ... | ... | ... |
表上没有将销售表连接到补充表的外键,但是有一个“ customer_id”和“ customer_reference”,这对于销售表和补充表都是唯一的,但是它们不一致。当我需要获取有关给定销售的更多信息时,这就是目前将两者结合使用的方式。
我正在使用Laravel 5.1和一个MySQL数据库,我想在sales表中添加两个字段; Supplemental_id和Supplemental_type,以便快速有效地创建多态关系。
所需结构
销售表
| id | supplemental_id | supplemental_type | customer_id | customer_ref | ... |
|---------|-----------------|-------------------|-------------|--------------------------------------|-----|
| 1237567 | 2858 | App\SuppOne | 354 | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| 1237568 | 90488 | App\SuppTwo | 867 | ref89b72 | ... |
| ... | ... | ... | ... | ... | ... |
我需要将这两个字段添加到每个销售记录中,但是我不确定如何使用原始SQL来完成此操作,因为我希望这比迁移中的处理要快得多。我想知道如何在SQL中(如果可能)处理从table_name到App \ ClassName的映射。销售表中大约有150万条记录,遍历所有这些记录不会花费很短的时间。
最佳答案
界线之间的东西。
它可以潜在地覆盖特定销售记录的数据(即SuppFourteen覆盖SuppOne数据),但这就是您在问题中提出的方式。
$fourteen_tables = [
'supplemental_table_1' => App\SuppOne::class,
// ...
];
foreach ($fourteen_tables as $table => $class) {
DB::table('sales_table')
->join($table, function ($join) use ($table) {
$join->on($table.'.customer_id', '=', 'sales_table.customer_id')
->on($table.'.customer_ref', '=', 'sales_table.customer_ref');
})
->update([
'sales_table.supplemental_id' => DB::raw($table.'.id'),
'sales_table.supplemental_type' => $class,
]);
}
关于mysql - 使用SQL将补充表的ID和类型添加到父表中(MySQL和Laravel多态关系),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51776685/