Этот точный вопрос был задан на IRC-канале #django некоторое время назад, хотя он хотел получить игровое поле переменного размера для разных экранов.
Общая рекомендация заключалась в том, чтобы сначала использовать хороший, чистый, нормализованный метод и оптимизировать его до денормализованного состояния при возникновении проблем с производительностью. Основная причина, по которой сначала нужно идти по пути нормализации, заключается в том, что база данных построена так, чтобы довольно легко обрабатывать множество взаимосвязей и может легко кэшировать полученные результаты, если они не меняются слишком часто.
Под нормализованной установкой я подразумеваю (псевдокод):
Table Board
{
BigInt id;
String name;
Date date_played;
etc...
}
Table Tile
{
BigInt id;
ForeignKey board; // what board the tile belongs to
ManyToMany items; // items on this tile
ManyToMany players; // players on this tile
etc...
}
Table Item
{
BigInt id;
String name;
}
Table Player
{
BigInt id;
String name;
}
// many-to-many link table
Table TileItem
{
BigInt id;
BigInt tile; // tile id
BigInt item; // item id
}
// do the same thing for players
Table TilePlayer
{
BigInt id;
BigInt tile;
BigInt player;
}
Вы будете хранить 100 записей на доске, но это того стоит, если вы спросите меня. Это облегчает поиск всех фишек игрового поля. Запись в отдельную ячейку может быть выполнена только с помощью ее идентификатора, без сложной интерпретации строк или чего-либо еще.