2010-01-05 5 views
1

Я использую PostgreSQL.Должен ли я использовать тип массива PostgreSQL в следующем случае

Я понимаю, что существует тип данных Array для PostgreSQL.

http://www.postgresql.org/docs/8.1/interactive/arrays.html

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

Они производят полукондукторные устройства. Каждый блок полукондуктора может иметь переменное количество параметров измерения.

Я планирую разработать таблицу следующим образом.

SemicondutorComponent 
===================== 
ID | 


Measurement 
================= 
ID | Name | Value | SemicondutorComponent_ID 

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

SemicondutorComponent 
===================== 
1 | 
2 | 

Measurement 
================= 
1 | Width  | 0.001 | 1 
2 | Height  | 0.021 | 1 
3 | Thickness | 0.022 | 1 
4 | Pad0_Length | 0.031 | 1 
5 | Pad1_Width | 0.041 | 1 
6 | Width  | 0.001 | 2 
7 | Height  | 0.021 | 2 
8 | Thickness | 0.022 | 2 
9 | Pad0_Length | 0.031 | 2 
10| Pad1_Width | 0.041 | 2 
11| Pad2_Width | 0.041 | 2 
12| Lead0_Width | 0.041 | 2 

Предположим, завод производит 24 миллионов единиц в 1 день

SemicondutorComponent таблица будет иметь 24 миллионов строк в 1 день

Предположим, один SemicondutorComponent блок имеет 50 параметров измерения. (Может быть больше или меньше, может быть, в зависимости от типа SemicondutorComponent)

таблицы измерений будет иметь 24 * 50 миллионов строк в 1 день

Является ли это эффективным дизайн таким образом?

Я хочу иметь сверхбыструю скорость записи и разумную быструю скорость чтения из базы данных.

Или я могу использовать средство PostgreSQL Array?

SemicondutorComponent 
===================== 
ID | Array_of_measurement_name | Array_of_measurement_value 
+0

Итак, ваш вопрос не касался массивов, но гораздо более общий: http://archives.postgresql.org/message-id/[email protected] – alvherre

+0

Нет! Это совершенно другой набор проблем. –

ответ

3

Я не могу прокомментировать скорость записи массивов в сравнении обычных таблиц, но, насколько я могу судить, дизайн с 2-х массивов будет довольно громоздким для выполнения запросов.

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

Теперь о дизайне со столами: вы, похоже, обеспокоены скоростью записи. 24 миллиона компонентов в день, это 1 миллион строк в час, что не так много. раз 50, в худшем случае, для измерений - это 51 миллион строк в час, поэтому менее 1 миллиона строк в минуту. Я думаю, что это должно быть выполнимо, хотя было бы целесообразно вставлять вставки и избегать многократных вставок ряда во многих коротких транзакциях (лучше вставлять их и фиксировать в пучках, например, 10.000 или 100.000).

Я действительно думаю, что вам нужно будет также разработать решение для архивирования и/или агрегации, потому что он не выглядит очень удобным для хранения этих томов. Я также сомневаюсь, что это тоже полезно, но, возможно, я просто не понимаю цели этой базы данных. Я имею в виду, мне кажется маловероятным, что вы хотите определить индивидуальное измерение одного компонента, скажем, через 1 год после его изготовления.В то время как представляется полезным сохранять статистику, как средние, минимальные, максимальные и stddev измерения с течением времени. Но, возможно, вы можете немного объяснить об этом.

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

+0

Да. вам нужна информация для отдельного компонента. клиенты просто хотят этого. –

1

Это зависит от того, как вы планируете получать доступ к данным и, во-вторых, о том, как вы планируете его хранить.

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

С другой стороны, если вы собираетесь хранить значения в одно и то же время, то использование массивов, вероятно, хорошо. Если вместо этого вы сначала сохраните ширину, затем ОБНОВЛЯЕТ строку для установки высоты и т. Д., Производительность убьет вас, потому что каждый UPDATE в Postgres должен быть очищен VACUUM.

Я согласен с Роландом, что вам, вероятно, нужна какая-то агрегация. Возможно, вы захотите также посмотреть на разделы, чтобы вы могли усекать (или удалять) старые разделы, без накладных расходов на пылесосить мертвые строки, вызванные удалением старых данных.

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