2009-07-25 5 views
1

Я проектирую базу данных и столкнулся с препятствием. Хорошо, это не так много, как просто то, что мне не нравится. У меня будет до 1000 различных сценариев, и в каждом сценарии мне нужно будет сохранить состояние каждого из 64 разных переключателей. Я работал в этом вокруг, насколько я могу и придумать следующее:Лучший дизайн базы данных?

Table Scenario 

Scenario_ID 
Scenario_Name 


Table Toggles 

Scenario_ID 
Toggle_1 
Toggle_2 
... 
... 
Toggle_64 

Это оставляет меня, что с 65 строки Переключает таблицу. Я продолжаю думать, что должен быть лучший способ, чем иметь 64 столбца «on» или «off», но я не понимаю, что это может быть. Я не хочу сохранять состояние переключения в CSV в одном столбце, потому что он будет постоянно меняться и должен анализироваться довольно часто. Мне было бы намного легче обновить таблицу, просто обновив Toggle_14 до «off», вместо того, чтобы анализировать CSV, изменять его и перезагружать. Есть предположения?

ответ

6

Используйте многие-ко-многим:

Table Scenario (Id, Name) 


Table ScenarioToggles (ScenarioId, TogglesId, ToggleState) 


Table Toggles (Id, ToggleName) 

Поле, ToggleState в таблице ScenarioToggles будет содержать значение On/Off.

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

+0

Допустимый вариант, но помните, что вы получите тонкие ушибы и сложные запросы, если вы используете переключатели для предикатов в предложении where. –

1

Вы можете создать Toogles таблицу, как это:

Scenario_ID 
Toogle_nr 
Toogle_state 

и получить 64 записей для каждого сценария.

Однако, если количество очков toogles не изменится часто, и в каждом сценарии вам понадобятся все toogles, ваше решение кажется лучшим и самым простым.

1

Это хак (вроде, ish, kinda), но в зависимости от требований к поиску вы можете просто сохранить только одну строку с 64 символами, доступ к которой вы можете получить на своем языке программирования в качестве массива.

Однако многие, многие, недостатки в этом более чем вероятно превышают преимущества. (Опять же, сохранение в памяти 64 бит информации об удаляемой информации в первую очередь является довольно странным требованием.)

3

Тип MySQL BIGINT имеет 64 бита, поэтому вы можете использовать его для хранения до 64 флагов в a bit field. Технически это ломает первую нормальную форму (только одно значение за столбец), но это нормально, если 1) у вас никогда не будет более 64 флагов, и 2) вы всегда извлекаете флаги как группу в любом случае.

В качестве альтернативы, вы можете хранить каждый флаг в отдельной строке, например:

 
     composite key 
    ===================== 
    Scenario_ID Toggle_ID Value 
     1   0  0 
     1   1  1 
     1   2  1 
     (...) 
     1   63  0 
     2   0  1 
     (...) 

Этот способ является более расширяемой и делает его легче иметь дело с единичными флагами в запросах, но вы будете ВОССТАНОВЛЕНИЕ 64 строк за раз, если они имеют дело с ними как группой в приложении.

1

Поскольку ваш вопрос отмечен как «mysql», я бы рекомендовал использовать the SET type. Однако обновление записей для переключения значений может быть немного сложным, поскольку MySQL не предлагает для этой цели функции (поиск REMOVE_FROM_SET в буфере отслеживания MySQL для обходного пути.) С другой стороны, он очень компактный и не требует вы можете присоединиться к 64 таблицам или использовать агрегированные функции для каждого запроса SELECT.

1

Некоторые люди просто стараются быть слишком умными. Используйте одну таблицу с именами сценариев Id, name и 64 toggle. Это хорошо нормированное, быстрое, экономичное пространство и расширяемость.

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