我对使用SQL还不太熟悉,但我遇到了一个关于使用标记时堆栈溢出的问题。
Recommended SQL database design for tags or tagging
这使我在数据库中创建了以下表:
医生
---------------------------------------------------------------
| Doc Id (PK)(int) | Doc Title (varchar) | Doc Link (varchar) |
---------------------------------------------------------------
| 1 | Printing | http://example.com |
---------------------------------------------------------------
| 2 | Format | http://example.com |
---------------------------------------------------------------
标签
--------------------------------------
| Tag Id (PK)(int) | Title (varchar) |
--------------------------------------
| 1 | print |
--------------------------------------
| 2 | guide |
--------------------------------------
| 3 | support |
--------------------------------------
DocTag公司
---------------------------------
| DocId (int) | TagId (varchar) |
---------------------------------
| 1 | 1, 3 |
---------------------------------
| 2 | 2, 3 |
---------------------------------
但是,我不能在
DocTag
表和其他两个表之间创建外键,因为我需要在TagId
的DocTag
中创建一个排序数组,因为一个文档可以有许多标记。我在尝试创建主键时遇到一个错误,我认为这是由于TagId
中的varchar变量造成的。有什么建议可以克服这个问题?
最佳答案
DocTag公司
---------------------------------
| DocId (int) | TagId (int) |
---------------------------------
| 1 | 1 |
---------------------------------
| 1 | 3 |
---------------------------------
| 2 | 2 |
---------------------------------
| 2 | 3 |
---------------------------------
外键必须与它们引用的列的数据类型匹配。
每个外键引用必须是单个值。没有逗号分隔的列表。
将每个TagId值放在自己的行上,即使您必须重复DocId。
见my answer to: "Is storing a delimited list in a database column really that bad?"