Что может быть лучшей моделью таблиц SQL для хранения строк данных с 82 столбцами? - PullRequest
3 голосов
/ 28 июля 2011

Мне нужно сохранить показатели, поступающие с устройств, в базу данных SQL (SQL Server 2008). Каждое устройство дает в одно и то же время один и тот же набор мер. Массив состоит из 80 мер, которые можно сгруппировать.

Чтобы возобновить, в определенный момент времени t (x) у меня есть следующие данные (t (x), рассматриваемые как один "сеанс" мер):

  • t (0): DeviceID, DateTime, 80 тактов
  • t (1): DeviceID, DateTime, 80 тактов
  • ...

Устройство создает в сеансе мер t (x) 8 наборов одного и того же типа из 10 мер (a, b, c, d, e, f, g, h, i, j) (a, b , c ... представляет тип мер как int, float, double и т. д.), соответствующий 8x10 = 80 тактов.

Пример:

  • набор N ° 1 может быть (10, 2, 3,2f, 4,76, «Данные1», 3, 2, 2,2, 5,6f, 10,0f)
  • set N ° 2 может быть (2, 4, 31.2f, 4.23, «Data2», 1, 1, 3.2, 2.2f, 2.1f)
  • ....
  • набор N ° 8 может быть (10, 7, 1.1f, 2.35, «Data8», 8, 1, 2.1, 2.1f, 8.2f)

Примечание: количество наборов мер 8 не изменится.

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

Я думал об этих возможностях:

  • Это может быть одна таблица с 82 столбцами.
  • Это может быть одна основная таблица (DeviceID, DateTime) и 8 вложенных таблиц, представляющих 8 наборов мер.
  • Это может быть одна основная таблица (DeviceID, DateTime) и 1 вспомогательная таблица, которая может иметь один набор мер, и тип, указывающий, какой набор мер.

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

Если показатель a из одного набора мер обычно можно сравнить с a из другого набора (либо другого набора в той же группе мер, либо из совершенно другого набора), чем все эти a значения должны храниться в одном столбце. Если это так, вы должны определенно исключить таблицу шириной 82 столбца - любые достаточно сложные критерии в предложении WHERE могут взорваться, если вам нужно рассмотреть 8 a столбцов, 8 c столбцов и 8 f столбцы.

Ключ для этой таблицы будет {DeviceID, DateTime, SetNo}.

2 голосов
/ 28 июля 2011

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

CREATE TABLE deviceData
  ( deviceID INT
  , sessionID INT
  , setID INT
  , a int
  , b int
  , c int
  , d int
  , e int
  , f int
  , g int
  , h float
  , i float
  , j double
  , PRIMARY KEY (deviceID, sessionID, setID)
  ) ;

Вы также можете иметь deviceSession, где можно хранить поля date или datetime для каждого сеанса:

CREATE TABLE deviceSession
  ( deviceID INT
  , sessionID INT
  , measureTime DATETIME
  , PRIMARY KEY (deviceID, sessionID)
  ) ;

Я бы также добавил ограничение внешнего ключа от deviceData к этой таблице:

ALTER TABLE deviceData
  ADD FOREIGN KEY (deviceID, sessionID) 
        REFERENCES deviceSession(deviceID, sessionID)

И каждая INSERT может быть транзакцией, которая вставляет одну строку в deviceSession и 8 строк в deviceData.


Пример данных:

+----------+-----------+-------+---+---+----+----+---+---+----+-----+-----+-----+
| deviceID | sessionID | setID | a | b |  c |  d | e | f |  g |  h  |  i  |  j  |
+----------+-----------+-------+---+---+----+----+---+---+----+-----+-----+-----+
|    1     |     1     |   1   | 7 | 8 | -3 | 17 | 0 | 3 | -6 | 7.0 | 4.3 | 6.9 |
|    1     |     1     |   2   | 4 | 6 |  2 | 12 | 3 | 0 | -6 | 8.0 | 4.4 | 6.7 |
|    1     |     1     |   3   | 5 | 5 | -1 |  7 | 2 | 0 | -6 | 7.5 | 4.9 | 7.4 |
.................................................................................
|    1     |     1     |   8   | 0 | 9 | -6 | 29 | 0 | 7 | -6 | 7.8 | 6.3 | 7.3 |
|    1     |     2     |   1   | 5 | 4 | -6 | 29 | 9 | 7 | -6 | 7.9 | 6.3 | 4.3 |
|    1     |     2     |   2   | 4 | 3 |  2 | 12 | 3 | 0 | -6 | 8.0 | 4.4 | 6.7 |
|    1     |     2     |   3   | 5 | 5 | -1 |  8 | 2 | 0 | -6 | 7.5 | 4.9 | 7.4 |
.................................................................................
|    1     |     2     |   8   | 0 | 4 | -6 | 20 | 5 | 7 | -6 | 7.6 | 6.3 | 7.3 |
|    1     |     3     |   1   | 4 | 6 |  2 | 17 | 0 | 3 | -6 | 7.0 | 4.3 | 6.9 |
.................................................................................
.................................................................................
|    2     |     1     |   1   | 2 | 2 | -2 | 12 | 0 | 2 | -2 | 2.0 | 2.2 | 2.2 |
|    2     |     1     |   2   | 6 | 7 | -9 | 12 | 0 | 2 | -2 | 2.0 | 8.2 | 7.2 |
.................................................................................
.................................................................................
+----------+-----------+-------+---+---+----+----+---+---+----+-----+-----+-----+
1 голос
/ 28 июля 2011

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

Если вы будете работать с наборами 10, тогда ответ @ ypercube хорош.Если вы выполняете запросы, которые, как правило, работают с данными из всех наборов, 80 значений в некотором смысле являются «единицей», тогда 80 столбцов могут фактически означать то, что означают ваши данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...