2013-02-22 3 views
0

У меня есть образец таблицы ниже:таблицу, содержащую несколько флагов

+-------------------------------------------------------------------+ 
| id | name | flag1 | flag2 | flag3 | flag4 | flag5 | flag6 | flag7 | 
+-------------------------------------------------------------------+ 
| 1 | fred | 1  | 0  | 1  | 1  | 1  | 1  | 1  | 
+-------------------------------------------------------------------+ 

То, что я хотел бы знать, это самый эффективный и простой способ, чтобы получить эти данные?

В настоящее время я работаю с Enum, у которого есть Flag Attribute Logic.

В том случае, если:

flag1 = 1 
flag2 = 2 
flag3 = 4 
and so on.. 

Я просто создать таблицу с этим проектом, а затем добавить еще одну таблицу для Ищут этих значений:

+------------------+ 
| id | name | flag | 
+------------------+ 
| 1 | fred | 125 | 
+------------------+ 

Любые предложения?

ответ

1

То, что я хотел бы знать, это самый эффективный и простой способ, чтобы получить эти данные?

Зависит тм;)

У вас всегда есть ровно 7 флагов?

  1. Если да, то следует хранить их в одной строке.
  2. Если нет, переместите флаги в отдельную таблицу, которая находится в отношении N: 1 к «основной» таблице. Это позволит вам легко изменять количество флагов, не добавляя больше столбцов в таблицу.

Для (1) выше, вам нужно найти отдельные флаги?

  • Если да, сохраните их в отдельных полях, чтобы вы могли их индексировать отдельно. Но будьте осторожны, что индексирование полезно, только если индекс достаточно избирательный.
  • Если нет, вы можете попытаться сохранить некоторое пространство для хранения (и, что более важно, увеличить эффективность кеша) на encoding флаги как биты в одном целочисленном поле. Если вы не используете очень старую версию MySQL, подумайте об использовании BIT(M). Цитата из documentation:.

    «Этот тип данных был добавлен в MySQL 5.0.3 для MyISAM, и продлен 5.0.5 памяти, InnoDB, BDB и NDB кластер до 5.0.3, BIT является синонимом TINYINT (1) "

1

Вы можете хранить все свои флаги в одном поле Integer, используя двоичные функции для получения/установки различных бит. См .: MySql Bit Functions

Есть несколько комментариев на этой странице об этом прецеденте. Последняя представляет собой хороший пример, показывающий типичный SQL для чтения флаги:

SELECT 
SUM(IF(rubrik & 1, 1, 0)) actus, 
SUM(IF(rubrik & 2, 1, 0)) shopping, 
SUM(IF(rubrik & 4, 1, 0)) utils, 
SUM(IF(rubrik & 8, 1, 0)) communication, 
SUM(IF(rubrik & 16, 1, 0)) services, 
COUNT(user_id) AS total, 
FROM preferences p