数据库列可以有重复的外键吗?

时间:2018-08-27 18:35:11

标签: database postgresql database-design data-modeling

我正在为给定游戏构建用于交易卡的应用。这意味着,一个用户可以拥有多张卡片,甚至是重复的卡片。这是可能的方法,但我不知道它是否正确(甚至可能):

用户

---------------------------
|id| name | cards_ids     |
---------------------------
|20| John | 31, 40, 50, 50|
---------------------------

-------------------------------
|id| name      | type         |
-------------------------------
|31| Monster31 |  Aqua Monster|
-------------------------------
|50| Monster50 |  Rock Monster|
-------------------------------
|40| Monster40 |  Air Monster |
-------------------------------

如您所见,即使一个用户相同,也可以拥有许多卡。这种重复的外键方法可以正常工作吗?如果相关的话,我将使用Postgres进行

1 个答案:

答案 0 :(得分:1)

在设计数据库时,您需要考虑第三种范式。

在这种情况下,您要将卡的数量添加为属性

用户

-----------
|id| name |
-----------
|20| John |
-----------

拥有的卡

--------------------------------
|user_id| card_type_id  | count |
--------------------------------
|20     | 31            |   1   |
|20     | 40            |   1   | 
|20     | 50            |   2   |
--------------------------------

甚至更好的是,他们应该有自己的ID。即使两张卡是同一张怪物,它们也可以具有不同的属性,例如“近薄荷”或“薄荷”

您的卡片定义应类似于cards_type,用于定义卡片。但是任何人拥有的卡都是卡,即使是同一张卡,它们的ID也不同,因为是两张不同的卡

------------------------------------------
| card_id |  card_type_id  | condition   | 
------------------------------------------
|  1      |  31            |   Mint      |
|  2      |  40            |   Near Mint | 
|  3      |  50            |   Used      |
|  4      |  50            |   Mint      |
------------------------------------------

然后您需要所有权表来控制谁拥有什么

拥有的卡:

 | card_id  | owner_id |
 |    1     |    20    |
 |    2     |    20    |
 |    3     |    20    |
 |    4     |    20    |