MySQL类别列表vs独立类别表


MySQL Categories List vs Sepperate Categories Table

我正在创建一个博客网站,它可以让你为博客分配一个类别。原来的表是这样的:

+----+----------+-------+---------+
| ID | CATEGORY | TITLE | ARTICLE |
+----+----------+-------+---------+
| 01 | cars     | Title | Article |
| 02 | cars     | Title | Article |
| 03 | sport    | Title | Article |
| 04 | music    | Title | Article |
| 05 | music    | Title | Article |
+----+----------+-------+---------+
如您所见,类别是一个写好的属性。主题是有一个单独的类别列表,我创建它看起来像:
+-------------------+
| CAT_ID | CATEGORY |
+--    --+----------+
| 01     | cars     |
| 02     | sport    |
| 03     | music    |
+--------+----------+

将原表修改为:

+----+--------------------+----------+-------+---------+-----------+
| ID | BELONGS_TO_BLOG_ID | CATEGORY | TITLE | ARTICLE | AUTHOR_ID |
+----+--------------------+----------+-------+---------+-----------+
| 01 | 01                 | 01       | Title | Article | 01        |
| 02 | 01                 | 01       | Title | Article | 01        |
| 03 | 02                 | 02       | Title | Article | 02        |
| 04 | 02                 | 03       | Title | Article | 03        |
| 05 | 02                 | 03       | Title | Article | 03        |
+----+--------------------+----------+-------+---------+-----------+

现在,如果我想删除01类别的cars,而不是删除它(因为显然有2篇文章在这个类别中),我可能会将其更改为unnassigned。所以这里没有问题,但如果我要删除music (03)并将其更改为unnassigned,我最终会与ID的01 & 03被取消分配。所以现在当我运行搜索unnassigned文章时,它应该返回4,我只会看到2或一个错误。

拥有原始表,当有人更改类别cars时,他们只是UPDATE记录不是更好吗?

好吧,您可以验证它。如果你需要遵循数据库规则,你必须检查两个表之间的父子关系。有三种方法

1。FOREIGN KEY :这将阻止父记录删除,直到子记录存在

ALTER TABLE items
ADD FOREIGN KEY (category)
REFERENCES category(categoryTable)

2。从php脚本进行验证:一些存储引擎可能不支持第1点。在这种情况下,可以简单地使用php进行验证。在删除类别之前,请计数是否有非

产品
$sql="select count(*) as cnt  from items where category=CATEGORY_TO_BE_DELETED";
if(mysql_query('cnt')>0) //means it has some items 
  //do not delete or throw some error
else
  //delete

3逻辑删除/软删除:有时你需要删除类别(假设你有1000个产品在它下面,你不能删除它)。然后你可以有一些flagsis_deleted。您可以onoff, flagdelete undelete it