我对使用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表和其他两个表之间创建外键,因为我需要在TagIdDocTag中创建一个排序数组,因为一个文档可以有许多标记。我在尝试创建主键时遇到一个错误,我认为这是由于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?"

10-07 23:33