Я думаю, что наиболее естественным было бы создание таблицы для карт, в которой была бы одна запись для каждой карты в колоде, а затем запись для рук, в которой была бы одна запись для каждой карты в руке.,Если есть данные о руке в целом - имя игрока?где он сидит за столом?сколько у него фишек?что угодно - тогда вам понадобится отдельный стол для руки, а не карты в руке.Я бы также создал таблицу соответствия для костюмов.
(Мы могли бы обсудить здесь использование синтетических ключей по сравнению с естественными ключами, но это уже другая тема.)
card (cardid, suitid, rank)
suit (suitid, suitname)
hand (handid, playername, whatever)
handcard (handcardid, handid, cardid)
Мой первый импульс был бысделать «ранжирование» числом от 1 до 13, и перевести 1 в «туз» и 11–13 в «джек», «ферзь» и «король» во время вывода.Вы можете сохранить их в виде текста, но тогда будет сложно сравнить ранги, если в этом есть необходимость.т.е. решить, легко ли 13> 10 для базы данных;Король> 10. Не так уж и много.
Я бы определенно НЕ пытался втиснуть идентификацию нескольких карт в одно поле, независимо от того, разделены ли они точками или идентификаторами фиксированной длины или чем-то еще.Для этого потребуется, чтобы в вашей программе был код, разбирающий это поле для получения нужных вам данных, а не просто позволяющий базе данных получать нужные вам данные, для чего и нужны базы данных.
Я не знаю, что вы хотите сделать с этими карточными руками, но большинство вещей, которые вы, вероятно, захотите сделать, довольно легко с такой структурой, как я описываю, довольно сложно, если вы соберетесписок карт в одном поле.Мол, у кого есть пиковый король?Легко:
select playername
from hand
join handcard using (handid)
join card using (cardid)
join suit using (suitid)
where suit.name='Spades' and card.rank=13
Или «Сколько лицевых карт у каждого игрока?»
select playername, count(*)
from hand
join handcard using (handid)
join card using (cardid)
where card.rank between 11 and 13
Конечно, «Какие карты у игрока №3?»это также просто:
select rank, suitname
from handcard
join card using (cardid)
join suit using (suitid)
where handid=3
Выполнение этих запросов в упакованном формате потребует сложных вызовов извлечения строк.А манипуляции со струнами - это всегда боль.Как вы всегда сталкиваетесь с проблемами, например, если я ищу 2 в тексте, как я могу исключить 2, которые являются частью 12?и т.д.