[MSSQL 2008] Есть парочка вопросов

базы данных sql MS SQL 2008

Всем привет.
Есть таблица, в которой нужно хранить значения, имеющие разный тип (bigint или datetime или float или строка).
В общем задача сделать универсальную структуру, при помощи которой можно сохранять данные разных типов.
Пока я вижу 2 варианта, или создание 4х таблиц, к которым обращаться в зависимости от типа по id или сделать одну таблицу со столбцами разных типов данных и нужный записывать, а остальные выставлять в NULL. Но при этом память эта строка будет занимать, как если бы все столбы были заполнены или база данных сама оптимизирует данные?



Примечание:
Igor Pomaranskiy, как я и писал ранее, нужно сделать универсальную структуру, для хранения данных с различных устройств, не добавляя и изменяя общую структуру таблиц. Скажем у нас есть 2 устройства (их может быть намного больше), с одного приходят целочисленные данные, с другого с плавающей точкой и сообщения в виде текстовой строки.Описание устройств добавляется в таблицы-справочники, а их данные хранить в каких то таблицах.
Данных будет очень много, поэтому делать я и уделяю внимание тому, как отводит память база данных под NULL, а то в итоге база будет занимать в 3 и более раза больше, чем положено.
Ответы:
1) Последнее, о чем стоит думать при проектировании БД — это оптимизация памяти. Заморочившись с ужатием данных для экономии каждого байта, вы, скорее всего, получите базу, которая зверски тупит.
2) Если вы не накосячили с архитектурой базы, и у вас _действительно_ есть необходимость хранить в базе информацию неизвестного типа — как именно это реализовать, зависит от того, какие действия вам потом нужно выполнять с этими данными. Если просто нужно хранить и выводить значения — можно просто сажать все данные в виде строк. Если же с числовыми типами нужно выполнять вычисления _средствами БД_ (т.е. считать среднее арифметическое с помощью AVG, например) — тогда такой вариант не прокатит, и лучше сделать 4 столбца.
Создайте для хранения данных с каждого устройства отдельную таблицу. Это ведь совершенно разные данные, к которым в последствии могут применяться совершенно разные подходы при обработке. В чем проблема, зачем это пихать в одну таблицу?
«…Данных будет очень много, поэтому делать я и уделяю внимание тому, как отводит память база данных под NULL, а то в итоге база будет занимать в 3 и более раза больше, чем положено. …»
— вот об этом я и говорю. Не путайте базу данных с массивом. База данных проектируется под быструю обработку информации, а не под экономию оперативной памяти и дискового пространства. СУБД как раз _придуманы_ для обработки _больших_ объемов информации. Поэтому, даже если у вас из 1000 записей 998 будут содержать NULL, и только 2 — текстовые строки длиной 200 символов, всё-равно делается поле длиной 200 символов, а не городится огород с внешней таблицей, куда будут сохраняться только непустые значения.


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.