Должен ли я использовать PostgreSQL Array Type в следующем случае - PullRequest
1 голос
/ 05 января 2010

Я использую PostgreSQL.

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

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

Ответы [ 2 ]

3 голосов
/ 05 января 2010

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

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

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

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

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

1 голос
/ 05 января 2010

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

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

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

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

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