我有2张桌子。类别表中的“ media_id”引用媒体表中的“ id”。媒体表中的每个项目在类别表中可以具有零个或多个类别。
媒体表
| id | options
|----------------|
| 1 | ...
|----------------|
| 2 | ...
|----------------|
| 3 | ...
|________________|
类别表
__________________________
| id | category | media_id |
|--------------------------|
| 1 | fashion | 1 |
|--------------------------|
| 2 | sport | 2 |
|--------------------------|
| 3 | sport | 3 |
|--------------------------|
| 4 | cats | 4 |
|--------------------------|
| 5 | dogs | 4 |
|--------------------------|
| 6 | sport | 5 |
|__________________________|
当我将数据保存在表中时,我想更新类别。我以前的流行方式是:
对于每种媒体:
删除以前的类别:
从类别表中删除,其中media_id =%d
添加新类别
对于每个类别:(可以有零个或多个)
插入类别表(类别,媒体ID)
这很好,但是它会运行很多查询(对于每种媒体,请删除先前的类别,如果该媒体上存在类别,则为每个新类别插入新的类别)。
我已经在类别表中有了一个约束,该约束使用该media_id引用了媒体表,并且每次删除媒体时,都会为该媒体删除所有类别。这很好用。
问题是何时有人编辑所有这些媒体(在所有这些媒体上添加和删除某些类别,而我要保存这些更改。
如何改善类别表的更新过程?
您需要三个表并进行一些重新编程
第一张表:media(mid,etc,etc2)
| mid| options
|----------------|
| 1 | ...
|----------------|
| 2 | ...
|----------------|
| 3 | ...
|________________|
第二表:category (cid,category)
| cid | category |
|---------------|
| 1 | fashion |
|---------------|
| 2 | sport |
|---------------|
| 3 | cats |
|---------------|
| 4 | dogs |
|---------------|
| 5 | frogs |
|_______________|
第三,关系表:rel_cat_media(id , ref_cid , ref_mid)
| id | ref_cid | ref_mid |
|--------------------------|
| 1 | 1 | 1 |
|--------------------------|
| 2 | 3 | 2 |
|--------------------------|
| 3 | 2 | 3 |
|--------------------------|
| 4 | 3 | 4 |
|--------------------------|
| 5 | 4 | 4 |
|--------------------------|
| 6 | 2 | 5 |
|__________________________|
[拥有新类别时,您永远不会删除类别,只会添加到类别中。
当您删除介质时,您还具有一个AFTER DELETRE TRIGGER
,它也从删除介质中删除具有media_id的所有行,因此您可以一次删除多个介质并删除所有相关行。
可以在关系表中插入新行,可以插入行,也可以不插入行。但这可以通过在gui中选择类别,然后使用新插入的mid(media id)运行循环来实现。
只需要一点编程,就不会有太多麻烦。
仅SELECT
查询需要另一个INNER JOIN
。