Как я мог иметь один столбец для хранения произвольного количества пользователей

У меня есть таблица, в которой хранятся «Совпадения», эти совпадения имеют следующие столбцы: MatchId, TeamA, TeamB, Wager, Winner.

Я хочу, чтобы TeamA и TeamB возвращали список игроков для каждой команды. Число может быть произвольным для каждого, возможно ли это или даже практично? Я не могу думать ни о каком другом способе проектирования этого. Есть ли лучшая схема для всего этого? Игроки будут иметь UserId, а пользователь не привязан к команде, команда зависит только от матча.

РЕДАКТИРОВАТЬ: например, игрок A, B, C, D, E, F

Матч 1: 3 на 3 ABC против DEF

Match2: 3 на 3 DAB против FEC

Игрок не должен быть привязан к какому-либо конкретному TeamId, поскольку он зависит только от матча. Игрок может объединиться с кем угодно в матче.


person anthonypliu    schedule 15.03.2011    source источник
comment
В зависимости от того, как игрок относится к командам или матчам, вам, вероятно, понадобится таблица Players с внешним ключом TeamID или некоторая форма таблицы сопоставления, которая связывает игроков с матчами в командах.   -  person Adam Houldsworth    schedule 16.03.2011
comment
Чего именно вы пытаетесь достичь? Вам нужен разделенный запятыми список командных игроков для каждой команды в одном столбце?   -  person RichardTheKiwi    schedule 16.03.2011
comment
Сериализация — это процесс преобразования объектов памяти в поток байтов, пригодных для записи на диск/передачи по сети. Десериализация - это наоборот. Учитывая эту информацию, как сериализация связана с получением данных из SQL?   -  person Roman Royter    schedule 16.03.2011
comment
Я немного обновил вопрос, так что, надеюсь, теперь это имеет смысл   -  person anthonypliu    schedule 16.03.2011
comment
@OMG, конечно, meta.stackexchange.com/questions/81753   -  person RichardTheKiwi    schedule 16.03.2011
comment
@OMG Ponies (снова стук в груди!) сказал: You're not a mod, not even close, so don't waste your time telling me how things should be done., ха, ха, ха, я думал, что это сообщество сверстников?   -  person RacerX    schedule 17.03.2011


Ответы (3)


Возможная схема базы данных может выглядеть так: введите здесь описание изображения

Затем вы можете выбрать из него так:

SELECT M.*, P.*
FROM Matches M
JOIN MatchPlayers MP ON MP.MatchID = M.MatchID
JOIN Players P ON P.PlayerID = MP.PlayerID
WHERE M.TeamA_ID = MP.TeamID OR M.TeamB_ID = MP.TeamID

Извините меня, если мой SQL грубоват по краям или схема ерунда - скорее всего, надеюсь, она должна работать незначительно.

Этот конкретный SQL не говорит вам о команде, в которой был игрок, но информацию можно получить с небольшими изменениями.

Для того, что вы хотите, данные, которые относятся к другим данным, сериализация не является ответом - или это не то, что вы думаете... Я чувствую здесь несоответствие терминологии. Почитайте об использовании баз данных из .NET — в Интернете есть множество отличных руководств. Также почитайте о проектировании реляционных баз данных, опять же веб-источники отлично подходят для этого.

person Adam Houldsworth    schedule 15.03.2011
comment
Упреждающий ответ... онлайн-инструмент, который я использовал, находится здесь, и я распечатываю его, чтобы получить изображение: dbschemaeditor .com/OnlineDB.aspx - person Adam Houldsworth; 16.03.2011
comment
Красиво - немного завидую твоей красивой картинке! - person Jon Egerton; 16.03.2011
comment
Приложение Silverlight тоже, кажется, я не сталкиваюсь со многими из них в дикой природе :-) - person Adam Houldsworth; 16.03.2011

Я предполагаю, что вы используете .NET для использования ваших данных. Вы можете создать класс команды со свойством Players в виде списка. Поместите атрибут [Serializable] в класс.

Используйте метод сериализации для преобразования команды в строку. Напишите строку базы данных.

Используйте метод десериализации, чтобы десериализовать команду обратно в объект в памяти.

См. эту статью для начинающих: http://msdn.microsoft.com/en-us/library/90c86ass(v=vs.71).aspx

Лично я бы использовал больше таблиц. Иметь сущность Team с отношением 1-* к сущности Player. Поместите команду FK в свою таблицу матчей.

Получить игроков на матч можно:

SELECT P.PlayerName
FROM Matches M (NOLOCK)
JOIN Team T (NOLOCK)
  ON T.TeamID = M.TeamA_ID
JOIN Players P (NOLOCK)
  ON P.PlayerId = T.PlayerId

UNION ALL

SELECT P.PlayerName
FROM Matches M (NOLOCK)
JOIN Team T (NOLOCK)
  ON T.TeamID = M.TeamB_ID -- NOTE TEAM B
JOIN Players P (NOLOCK)
  ON P.PlayerId = T.PlayerId
person Slappy    schedule 15.03.2011

Два подхода:

1: Используйте XML для столбцов TeamA, TeamB — таким образом вы можете создавать полные списки команд в структурированной строке, которую легко обрабатывать в вашем приложении.

2: Используйте больше таблиц. Более полной схемой может быть:

Match MatchID Name Имеющие место совпадения

Команда TeamID MatchID IsHomeTeam Name Команды, участвующие в матче

Игрок PlayerID TeamID Имя Все игроки каждой команды

Изменить: это более простая версия после уточнения требований.

person Jon Egerton    schedule 15.03.2011
comment
Эй, большое спасибо за быстрый ответ, но дело в том, что я не знаю, практично ли иметь таблицу Team, потому что пользователь не будет привязан к команде ... так, например, каждый матч - это новая команда. Я мог бы играть с одним игроком в одном матче, а затем с другим игроком в другом матче. - person anthonypliu; 16.03.2011
comment
Несмотря на это, в каждом матче участвуют 2 команды. Вы можете абстрагироваться от пользовательского интерфейса, но в конечном итоге модель данных подходит. - person Slappy; 16.03.2011