Может ли столбец базы данных иметь дубликаты внешних ключей? - PullRequest
0 голосов
/ 27 августа 2018

Я создаю приложение для обмена карточками для данной игры. Это означает, что пользователь может иметь несколько карт и даже повторные карты. Это может подойти, но я не знаю, правильно ли это (или даже возможно):

Пользователи

---------------------------
|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 голосов
/ 27 августа 2018

Вам нужно думать о третьей нормальной форме при проектировании базы данных.

В этом случае вы хотите добавить количество карт в качестве свойства

Пользователи

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

CardsOwned

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

Или, что еще лучше, у них должен быть свой идентификатор. Даже когда две карты являются одним и тем же монстром, они могут иметь разные атрибуты, такие как «Near Mint» или «Mint»

Определение вашей карты должно быть что-то вроде cards_type, где вы определяете карту. Но карты, принадлежащие кому-либо, являются картами, где даже когда одинаковые карты имеют разные идентификаторы, потому что это две разные карты

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

тогда вам нужна таблица владения, чтобы контролировать, кому что принадлежит

CardsOwned:

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