MySQL类别列表与单独的类别表

时间:2014-08-01 10:24:59

标签: php mysql sql

我正在创建一个博客网站,可让您为博客分配一个类别。我看起来像这样的原始表:

+----+----------+-------+---------+
| 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        |
+----+--------------------+----------+-------+---------+-----------+

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

拥有原始表格会不会更好,当有人更改类别unnassigned时,他们只需cars记录?

1 个答案:

答案 0 :(得分:2)

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

<强> 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个产品,而您无法删除它)。然后,你可以拥有一些flags is_deleted。你可onoff flag 删除取消删除