как соотнести одну таблицу с другой для будущих записей - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть игровая таблица, в которой хранятся данные об игре. Затем еще одна таблица, в которой хранятся данные о новостях.

Пока все хорошо.

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

Этот способ работает, как задумано, когда игра существует. Поэтому, когда я вставляю новость, я могу связать ее с игрой, используя соединительную таблицу.

Однако бывают случаи, когда есть новости об игре, но игра не опубликована и не существует.

Так что мой вопрос будет; есть ли способ связать эти новости с конкретной игрой при создании записи игры.

Каков наилучший способ сделать это? Есть идеи?

Ответы [ 5 ]

2 голосов
/ 16 апреля 2010

у вас есть 3 варианта - 1 - установить флаг на игровом столе, чтобы сообщить, выпущен он или нет, и показать только имя (или даже не это), если игра не выпущена.

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

3-й НЕРЕКОМЕНДОВАННЫЙ вариант - связать их по имени игры, а не по первичному ключу, поэтому у вас есть столбец с именем game_name в таблице новостей, и он связывает таблицы таким образом. однако, это не удастся, если вы неправильно пишете вещи, и далеко не так хорош, как варианты 1 или 2.

2 голосов
/ 16 апреля 2010

Соединительная таблица - это путь. Если новостная статья о более чем одной игре, то она вам нужна. Для обработки игр, которые еще не существуют, просто вставьте для них строку, включите всю информацию о ней, которую вы в данный момент знаете (возможно, из новостной статьи), и укажите столбец статуса, который помечает ее как еще не выпущенную. Вы можете отобразить эту игру как еще не выпущенную или слухи и т. Д.

настроить таблицы примерно так:

Games
GameID           int          not null auto increment PK
GameStatus       char(1)      not null "P"=published, "N"=not released yet, "R"=game is only a rumor
GameReleaseDate  date         null
GameName         varchar(...) not null
GameDescription...
...

News
NewsID      int               not null auto increment PK
NewsTitle   varchar(...)      not null
...

GameNews
GameNewsID  int auto increment PK
GameID      int FK to Games.GameID
NewsID      int FK to News.NewsID

С помощью этой настройки вы можете иметь несколько игр, связанных с одним элементом новостей. Просто вставьте все соответствующие строки GameNews, чтобы связать каждую игру со строкой News.

Если игра еще не опубликована, вы все равно можете связать ее с новостями, создав строку «Игры» со статусом «N» или «R» (или что-то в этом роде) и используя таблицу GameNews так же, как для опубликованная игра. Вы можете заполнить все поля в играх как можно большим количеством информации и обновлять ее, как только узнаете больше. в конце у вас будет полная информация об игре в строке «Игры» (после публикации игры), и она будет ссылаться на все строки «Новости», даже если в новостях был только слух.

Чтобы дать вам представление о том, о чем я говорю, вот пример того, как будут выглядеть данные для «слуховой» игры с течением времени (это упрощенный пример без множества игр на строки новостей):

data as of 1/1/2010
    Games    GameID  GameStatus  GameReleaseDate  GameName
             1234    "R"         1/1/2012         "God of War 4"
    News     NewsID  NewsTitle
             543     "Future Of Games"
    GameNews GameNewsID  GameID  NewsID
             768         1234    543

data as of 4/1/2010
    Games    GameID  GameStatus  GameReleaseDate  GameName
             1234    "R"         1/1/2012         "God of War 4"
    News     NewsID  NewsTitle
             543     "Future Of Games"
             544     "Interview with John Hight"
    GameNews GameNewsID  GameID  NewsID
             768         1234    543
             769         1234    544

data as of 11/20/2010
    Games    GameID  GameStatus  GameReleaseDate  GameName
             1234    "N"         12/31/2011         "God of War IV"
    News     NewsID  NewsTitle
             543     "Future Of Games"
             544     "Interview with John Hight"
             545     "God of War Expected Next Year"
    GameNews GameNewsID  GameID  NewsID
             768         1234    543
             769         1234    544
             770         1234    545

data as of 8/15/2011
    Games    GameID  GameStatus  GameReleaseDate  GameName
             1234    "N"         12/01/2011         "God of War IV"
    News     NewsID  NewsTitle
             543     "Future Of Games"
             544     "Interview with John Hight"
             545     "God of War Expected Next Year"
             546     "Retailers Get Ready For New Games"
    GameNews GameNewsID  GameID  NewsID
             768         1234    543
             769         1234    544
             770         1234    545
             771         1234    546

data as of 1/1/2012
    Games    GameID  GameStatus  GameReleaseDate  GameName
             1234    "P"         12/01/2011         "God of War IV"
    News     NewsID  NewsTitle
             543     "Future Of Games"
             544     "Interview with John Hight"
             545     "God of War Expected Next Year"
             546     "Retailers Get Ready For New Games"
             547     "God of War IV Review"
    GameNews GameNewsID  GameID  NewsID
             768         1234    543
             769         1234    544
             770         1234    545
             771         1234    546
             772         1234    547

если бы 01.01.2012 вы заглянули на News.NewsID = 543, вы бы увидели, что он ссылается на полную и рецензированную версию Games.GameID = 1234, хотя статья News.NewsID = 543 о " По слухам "грядущая версия God of War. И все это было сделано без каких-либо изменений в старых строках News или GameNews.

1 голос
/ 17 апреля 2010

"Однако бывают случаи, когда есть новости об игре, но игра не опубликована и ее не существует."

Вы должны прояснить свои мысли о значении "существования". Если чего-то не существует, то ничто не может иметь к этому отношения, точка.

Если ваша бизнес-реальность заключает в себе разницу между «существующим и известным широкой публике» и «существующим, но только частным образом и не известным широкой публике», то ваши модели должны признать и повторить эту реальность.

Вполне возможно связать информацию с любой вещью, которая "существует, но не публично". Невозможно связать информацию с какой-либо несуществующей вещью.

1 голос
/ 16 апреля 2010

Поместить два внешних ключа в соединительную таблицу - хорошая идея. Внешние ключи ссылаются на вещи, которые существуют. Обеспечение этого называется "ссылочной целостностью". Разрешить ссылки на несуществующие предметы - это путь к хаосу.

Если вы получаете новостную статью об игре, которой еще нет (в базе данных), у вас есть два варианта: добавить игру в игровой стол перед добавлением ссылки на игру в соединительной таблице; в качестве альтернативы, пока опускаем связь между статьей и игрой.

1 голос
/ 16 апреля 2010

Самый простой ответ - получить внешний ключ от новостей к игре. Если вы создаете новости для игры, которой еще нет, просто создайте запись-заглушку в своей игровой таблице. Вы можете пометить его как таковой, если хотите. Когда вы добавляете игру, просто добавьте эту заглушку.

...