【发布时间】:2011-01-08 10:01:56
【问题描述】:
我有一个看起来像这样的表:
ID |关键字 |类别 |子类别 |子子类别 |子子子类
我是否需要将其拆分为两个表(关键字表和具有父 ID 的类别表) 如果一个关键字只能属于一个类别,子类别...等。意思是没有重复。还需要拆分吗?
【问题讨论】:
标签: sql normalization categorization
我有一个看起来像这样的表:
ID |关键字 |类别 |子类别 |子子类别 |子子子类
我是否需要将其拆分为两个表(关键字表和具有父 ID 的类别表) 如果一个关键字只能属于一个类别,子类别...等。意思是没有重复。还需要拆分吗?
【问题讨论】:
标签: sql normalization categorization
我会在两个表中执行此操作,每个外键都来自类别表:
Keywords
id (PK)
keyword
category_id (FK)
Categories
category_id (PK)
category
parent_category_id (FK)
类别表中的数据如下所示:
category_id category parent_category_id
1 Food null
2 meat 1
3 organic 1
4 fruit 3
关键字表中的数据如下所示:
id keyword category_id
1 grapes 4
2 chicken 2
【讨论】:
您只需要一张表来表示 1-1 映射。要表示 1-many 或 many-many 映射,您应该使用多个表。
如果一个关键词只能对应一个类/子类/子子类,你现在的布局应该没问题。
一个警告:如果您想根据关键字进行搜索,则分隔表格可能会提高性能。执行整数搜索要快得多。
关于将关键字值存储在另一个表中的讨论大致对应于this discussion 在另一个表中存储国家名称(大部分是静态的)。使用另一个表的一些关键优势可能是(口语)语言独立性、快速搜索以及以后易于更新。
【讨论】:
我会使用这样的两个表。
Categories
-------------------
PK,FK1 | CategoryID
| Keyword
| Category
SubCategories
--------------------
PK,FK1 | CategoryID
PK,FK1 | SubCategoryID
【讨论】:
如果您希望稍后重命名或重新排列类别,将其拆分可能是有意义的:
权衡两者的利弊,然后做出决定。m
【讨论】:
为什么不直接在 PK 中添加 ParentID 列和 FK?
【讨论】: