2013-04-03 2 views
0

Предположим, у вас есть таблица, которая будет содержать данные, зависящие от ситуации.Дизайн таблицы базы данных для зависимых от ситуации данных

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

В целом, лучше ли сделать таблицу достаточно широкой, чтобы обрабатывать все случаи, и оставить некоторые (но разные) части неиспользованными для каждой записи, или я должен сделать специальную таблицу для каждого случая?

Или есть какая-то другая техника, которая была бы лучше?

ответ

1

Я не уверен, если я правильно Вас понял, что, кажется, вы желаете т: п-отношение, которое потребовалось бы 3 таблицы:

CREATE TABLE game 
    (
    id int PRIMARY KEY, 
    game nchar(x) 
    ) 

CREATE TABLE solution 
    (
    id int PRIMARY KEY, 
    solution nchar(x) 
    ) 

CREATE TABLE game_solution 
    (
    id int PRIMARY KEY, 
    id_game int NULL REFERENCES game(id), 
    id_solution int NULL REFERENCES solution(id) 
    ) 
+0

Тогда мой вопрос: что, если решения для разных игр не обязательно вписываются в nchar? Возможно, одна игра - это множественный выбор, один - несколько ответов, у одного есть два ответа и т. Д. – Lars

+0

@Lars: Существуют различные способы: a) Поскольку кажется, что разные решения неструктурированы, вы зависите от размера данных, которые предлагает ваша СУБД, ; б) альтернативой было бы сохранить решения в файлах и сохранить ссылки на файлы в таблице [решение]. c) Вы также можете смешивать его, например. г. хранить более короткие решения внутри таблицы [решение] и более длинные решения в файлах. Однако в MS SQL VARBINARY (MAX) предусмотрено 2^31 - 1 байт, это почти 2 GiB. Я вряд ли могу представить себе решение игры, требующее большего объема памяти! Не могли бы вы поделиться тем, как вы решили проблему между тем? – lucas0x7B

0

Ваш вопрос путь вообще, так что короткий ответ is: Это зависит! Чем длиннее: «широкая» таблица - это простое решение, если у вас есть только несколько игр, которые не сильно отличаются. Бывают случаи, когда я пойду на это решение, но вообще нет.

Моя консультация: спросите себя, что общего для всех выборов/выборов. Эти данные должны перейти к общей таблице. Данные, относящиеся к определенной игре, должны поступать в отдельную связанную таблицу за игру.

Не знаю, как ваш фон как программист. Но если вы знакомы с программированием OO, просто используйте Google для стратегий, как сопоставить иерархии классов с базами данных SQL.

+0

Итак, следуя моему надуманному примеру, я должен составить таблицу «ответ» с столбцом «type_id». Затем присоедините соответствующую таблицу, например. «answer_type_a» с «ответом»? – Lars

+0

Да, например. Но есть 1001 вариант, и это действительно зависит от ваших точных данных. Если таблица ответов имеет только столбец type_id, она не имеет большого смысла. В зависимости от ваших запросов и механизма базы данных вы также можете использовать столбцы xml или json. Postgresqls hstore также может быть вариантом. – Achim

0

@Lars: Я просто перечитываю ваш вопрос.

Чтобы краток:

  1. Если вам нужно максимальную производительность, держать его полностью структурирован, даже если вам нужно создать много новых таблиц.

  2. Если вам нужно гибкость, e. г. сохраняя результаты будущих игр, в результате которых вы еще не знаете структуру результатов, не учитывая производительность, сохраняете двоичные значения или ссылки на файлы, содержащие решения.

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

  4. Если вы хотите, чтобы это было легко, используйте точки 1 или 2, так как 3 добавляет много сложности вашей программе.

Надеюсь, это правильный ответ. Мне любопытно, если у кого-то есть лучшее предложение!

Смежные вопросы