Ответы пользователя по тегу Базы данных
  • Как хранить IP в базе?

    IP-адрес это число. Для IPv4 - это 4 байта. Для IPv6 - это 16 байт.
    Если нужен только v4 - тогда можно взять INT. Если нужно и то и другое, то
    а) советую хранить оба адреса независимо, на время перехода они обычно доступны одновременно (если какой-то останется неизвестным - ничего страшного, пометите как NULL)
    б) хранить в виде строки смысла не вижу вообще, БД это место для хранения данных, а не для интерфейс для просмотра, и ориентироваться надо на хранение. Кто хочет красиво вывести - пусть строит нужный запрос с препобразованиями, выше уже привели отличные функции.
    в) храните в binary(4) и binary(16) чтобы иметь унифицированный подход (мне так было удобнее, советую и вам)
    г) только не надо varbinary - размер адреса постоянен, никакого var быть не может. Типы данных с фиксированным размером (даже binary) намного легче в хранении и обработке, чем с переменным. Не мучайте СУБД не по делу.
    Ответ написан
    Комментировать
  • Нормализация БД. Зло или добро?

    Видите ли в чем дело - нормализация это не столько для СУБД и не для приложения ее использующего. Это больше для вас, для разработчика (БД и/или приложения), и для целостности и согласованности данных.

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

    Именно по причине несовпадения двух структур БД: максимально нормализованной, удобной для разработчика/проектировщика, и оптимизированной для выполнения запросов - стандартный цикл проектирования БД включает в себя этап нормализации до опредленного уровня (хотя бы до 3нф), и последующей денормализации для ускорения конкретных запросов (также, как и построение необходимых индексов). Т.к. денормализация требует усложнения логики работы с базой (те самые обновления в нескольких местах), эту логику (чаще всего это хранимки или триггеры, реже - на стороне приложения) нужно реализовывать максимально аккуратно и формально. Это похоже на написание кода на высокоуровневом языке и последующая его компиляция под конкретную платформу с максимальными оптимизациями. Единственное важное отличие - особенности целевой платформы известны заранее, и компилятор, учитывающий эти особенности, можно написать один раз, а вот особенности работы БД в каждой задаче - свои, поэтому в каждом случае нужно проводить работу по оптимизации БД с нуля.

    Нужно отметить, что в современных системах денормализация схемы - не единственный и не всегда лучший способ повышения производительности. Кэширование часто используемых данных в каком-нибудь memcached - иногда проще и эффективнее, чем денормализация БД и поддержка ее согласованности.
    Ответ написан
    Комментировать
  • Какие технологии используются сейчас для работы с БД?

    Nipheris
    @Nipheris Куратор тега C#
    ORM-ку сверху накиньте, вместо прямого ADO.Net, и будет вам современные технологии. В тренде, очевидно, Entity Framework, хотя NHibernate - нестареющая классика.
    Можете заморочиться над архитектурой, вплоть до разделения на клиент и сервер - тогда будет место и для Web API.
    Или другой вариант - подтащить документую БД, хотя для бухгалтерии не факт что это хорошее решение (разве что в пару к реляционной, для хранения характеристик ваших товаров).
    Ответ написан
    Комментировать
  • Какой лучший способ сделать key-value для одного поля в бд?

    Есть вариант использовать key-value хранилище для key-value данных, раз у вас именно такие. Зачем вам пытаться искать схему данных, если этой схемы не предвидится? Возьмите Монгу, раз поля о разных клиентах разные.
    Ответ написан
    Комментировать
  • Как научиться строить модели БД sql в связке с С# (Цель- писать понятные ТЗ для программистов С#)?

    Nipheris
    @Nipheris Куратор тега C#
    Сложно вам посоветовать в такой ситуации что-либо. Интересно, чем занималась контора та, что программисты C# с sql не знакомы, разве что играми..
    В целом вам надо ознакомиться с современным представлением о реляционных БД (вы же все-таки аналитик, вам нужно знать на разных уровнях и масштабах), с архитектурой приложений, использующих РБД (толстые и тонкие клиенты, веб-приложения), и потом уже некоторые детали касающиеся языка.
    С точки зрения программиста C#, я бы от вас как от аналитика ожидал знание различных принципов и дисциплин доступа к рел. данным, а именно:
    - использование ORM: когда можно и нужно), когда хочется, но нельзя, когда можно "толстую" ORM (Entity Framework, NHibernate), а когда - тонкую (LINQ to SQL); использование кода на стороне БД - триггеры, хранимые процедуры;
    - принципы построения слоев доступа к данным в сочетании с бизнес логикой (паттерны и антипаттерны в этих ситуациях, например Anemic Data Model);
    - способы контроля версий схемы реляционной БД - миграции, source control для триггеров и хранимых процедур (если они есть), политики обновления схемы вместе с выкатыванием новой версии ПО;
    - формирование тестовых данных в тестовых базах;

    Вот если сможете по этим вопросам проконсультировать, то разработчикам останется только подучить SQL и конкретную ORM, если будете использовать.
    Ответ написан
    5 комментариев
  • Где полезны графы?

    > где наряду с NoSQL еще и графы используются
    интересная формулировка)

    > В каких случаях это в БД может быть полезно?
    во всех задачах, где глубина и "разнообразие" связей между сущностями сравнимо с количеством этих сущностей.
    Возьмем для примера две простые ситуации:
    1) есть заказ в интернет-магазине с некоторым числом заказанных товаров. Вне зависимости от того, реляционную модель вы будете использовать или какую-то еще, скорее всего вам будет удобно рассматривать две сущности: Order и OrderItem. В первую вы добавите сведения обо всем заказе целиком (инф. о клиенте, дату заказа, выбранный способ доставки, способ оплаты и т.д.). Во второй сущности у вас будет, например, id товара и его количество (1 микроволновка, 2 флешки, 5 CD-R). Теперь, чтобы вы могли знать, что какие-то OrderItem имеют отношение к конкретному Order, вам следует тем или иным способом смоделировать связь. Если у вас SQL-база, вы добавите к Order-у поле Id, а к OrderItem поле OrderId и сделаете внешний ключ. Если у вас документная база, то, к примеру, можно весь заказ с его элементами разместить в одном json-документе, и элементы заказа будут подобъектами в массиве items объекта заказа. Со временем у вас появится много заказов и много элементов заказов. Однако связи между ними у вас всегда будут достаточно простые: у каждого заказа будет некоторое количество элементов. Сами заказы вы связывать не будете, как не будете связывать элементы заказа. Глубина связей сущностей будет ограничена одним переходом.
    2) у вас есть социальная сеть (да, знаю, банальный пример), и конечно же у вас есть функция "добавить в друзья". В отличие от предудыщего примера, мы для рассмотрения можем взять только одну сущность - "пользователь", однако за счет того, что каждый каждого может зафрендить, у вас даже для одной сущности будет очень большой набор фактических связей, потенциально с большой глубиной (знакомые знакомых и т.д.).

    Обе проблемы теоретически можно решить с помощью SQL баз данных, однако графовые базы будут выигрывать во второй задаче в сложных запросах по обработке связей (скажем, найти всех моих друзей, которые идут на такое-то мероприятие). Этот выигрыш вытекает из архитектурных особенностей графовой БД, например, в графовой базе часто при сохранении связи сохраняется "указатель" на физическое расположение связанных данных, в то время как в реляционной базе связи моделируются внешними ключами, и при обработке требуют выполнения операций поиска (пусть и индексированного). Вообще, в каком-то смысле связи в графовой БД это first-class citizens, а в реляционной БД связи моделируются программистом (ограничения целостности вроде внешних ключей просто помогают ему поддерживать данные в согласованном состоянии).
    Ответ написан
    2 комментария
  • Какая есть хорошая книга c примерами по проектированию базы на SQL с упором на MySQL, PostgreSQL?

    Советую ERWin (коммерческий) и Oracle Data Modeler (бесплатный), а из книг возьмите Дейта для начала.
    Ответ написан
  • Когда набор связанных данных можно считать базой данных?

    В очень широком смысле БД можно считать массив данных, о структуре которого у вас достаточно информации для выполнения необходимых вам обработок, выборок и, вообще, операций. Например, если вы смотрите на бинарник в HEX-редакторе, и даже представления не имеете, что там - видео, картинка, или же записи о сотрудниках предприятия (ну или "догадываетесь" что там, но все же не имеете в распоряжении формальных и четких правил обработки этого набора байт), то это не база данных. Если же вы знаете, что в первых 4-х байтах у вас количество записей, а дальше - сами записи о сотрудниках, длиной 150 байт каждая, и вы знаете, где в этой записи нужные вам ФИО и зарплата - то это уже простейшая БД.
    Важно также, чтобы эти данные в той или иной степени отражали реальный мир: это могут быть актуальные данные, архивные (исторические) данные, но так или иначе вам должно быть известно (!), как эти данные соотносятся с реальностью. Даже если это тестовые данные, сгенерированные случайным образом - вам это должно быть известно. Иначе невозможно понять, можете ли вы в реальной системе принимать решения на основе этих данных, или нет.
    Конечно в современном мире файлик с записями "базой" обычно не называют, поэтому есть и другие критерии, например, упомянутая вами связность, и возможность ее реализации. Кроме того, если говорить о системе управления БД, то у нее должен быть формальный интерфейс для выполнения запросов по обработке данных - выборок, добавления и пр.
    Кстати, на вопрос проще ответить, если вы укажете конкретную модель БД - реляционную, объектную, или, например, документную. При введении модели вводятся и правила, которым должны удовлетворять данные, чтобы называться Базой данных.
    Ответ написан
    3 комментария
  • Как в триггерах ссылаться на таблицы и поля этих таблиц?

    Во-первых, как уже сказал Sumor, вам нужно подумать прежде всего о транзакционности операции, ваша задача - уменьшение значения Долга при занесении платежа - классический случай выполнения нескольких изменений в рамках одной транзакции. Так что это операцию вполне можно выполнить и на уровне приложения. С триггером могут быть свои заморочки - например, если впоследствии заходите удалить часть записей о платежах или перезалить их без изменения долга - то триггер придется отключить. Или как сказал Sumor, можно отключить их случайно и не заметить. С деньгами таких ситуаций надо избегать еще при проектировании. В общем конечно триггеры - вполне приемлемый способ обновления вычисляемых данных (долг - это именно такое значение), но я думаю в приложения, критичных к точности данных, лучше от них воздержаться.
    Или же вам подойдут хранимые процедуры - тогда логика изменения долга и добавления платежа будет более очевидной, и на уровне БД. Тогда вам нужно будет ограничить доступ к основным таблицам, чтобы случайно их никто не поменял, а все изменения допускать только с использованием хранимок. Этот подход менее масштабируемый, чем логика на уровне приложения, но более надежный, если у вас большой проект и много разработчиков - у БД в этом случае будет свой слой безопасности.
    Ответ написан
    Комментировать
  • В чем преимущества СУБД Oracle перед MySQL, PosgreSQL?

    Если без холивара - то преимущество оно всегда одно - т.к. вы платите баб$сы, то имеете возможность позвонить в саппорт 24/7 и спросить, почему не стартует сервер СУБД после ваших манипуляций с ним. Конечно, для постгреса есть EnterpriseDB, и это довольно серьезные ребята, так что все упирается, как и всегда, в опыт и доверие. Оракл - это огромные вложения в инженерные решения, многолетний опыт поддержки по всему миру ну и прочие дела. Также, как и какой-нибудь DB2, которому тоже уже 40 лет стукнуло.
    Когда вы храните в вашей БД данные стоимостью несколько миллионов долларов, становятся важны мелочи, не видные на первый взгляд - надежность восстановления после сбоев, отлаженность процедур бэкапа и восстановления, стоимость и оперативность масштабирования и еще 1000 и одна вещь.
    Ответ написан
    Комментировать
  • Общие вопросы по базам данных?

    > Цель по струтуре базы сделать ее максимально ненуждающейся в джоинах
    Почему поставлена такая цель? Может нужно технические вопросы пересмотреть? Отсутствие нужды в джоинах ведет к появлению избыточности, как раз таки обычно пытаются добиться обратного - минимума избыточности за счет использования джоинов. Хайлоад конечно выдвигает особенные требования, поэтому я и интересуюсь, почему было поставлено такое условие.
    > достижение 5-ой нормальной формы помимо того, что практически невозможно
    насчет невозможности поспорил бы. Скорее - оно редко целесообразно, 3NF обычно вполне достаточно. Но есть и исключения (темпоральные данные например). Насчет производительности тоже не соглашусь - производительность гораздо больше формируют правильно/криво построенные индексы и правильные/кривые запросы. Лучше 15 джоинов в запросе, использующем индексы, чем один LIKE '%str%' без полнотекстовой индексации. Современные СУБД умеют в кэширование индексов в памяти, а prepared statements позволяют не парсить один и тот же запрос миллион раз.

    А вообще, поймите одно правило: всегда есть проектирование сначала на бумаге, а потом уже в реале. Вы должны нормализовать прежде всего для себя, чтобы понимать, какие зависимости у вас в данных есть. Когда вы это все увидите, денормализовать всегда сможете. Ваши N итераций - это M+K, где M - это итерации по нормализации, K - обратный процесс, когда вы сознательно понижаете нормальную форму ваших данных. Если вы будете пропускать мимо глаз функциональные зависимости, ваши данные быстро превратятся в персональный адъ.

    И наконец, если вы такое спрашиваете - уверены, что потянете highload в принципе?
    Ответ написан
  • Как создать таблицы в mysql для хранения постов и их категорий?

    Таблица post_category(post_id, category_id), вся запись - первичный ключ, post_id - внешний ключ на post.id, category_id - внешний ключ на category.id. Наличие записи (62, 8) в такой таблице означает, что посту 62 присвоена категория 8. Чтобы вытащить все категории поста - делаете select category_id from post_category where post_id = , все посты в категории - select post_id from post_category where category_id = .
    Ответ написан
    Комментировать
  • Как работать с файлами базы данных *.DB в windows?

    Попробуйте открыть Access-ом. Само расширение, конечно, слишком универсальное, и толком по нему сложно что-то сказать. Если у "старой программы" есть что-либо, кроме exe-шника, посмотрите, что это - может быть там dll-ка от Visual FoxPro затесалась. Если формат общеизвестный, и его удастся определить, то потом уже можно подумать о способе подбора пароля.
    Ответ написан
  • Как получить 2 таблицы в хранимой процедуре в SQL Server?

    Nipheris
    @Nipheris Куратор тега C#
    А какова цель использования хранимой процедуры только для получения данных? Я понимаю вы бы делали запросы на модификацию с добавлением логики, чтобы все это выполнить на стороне БД, а выборку-то зачем? Если есть конкретные причины, укажите, и подумаем как лучше сделать.
    Ответ написан
  • Как спроектировать базу данных?

    Если коротко - то лучше сразу посмотрите на модель EAV, т.к. разбивать на отдельные таблицы имеет смысл только для ОЧЕНЬ специализированных магазинов, у которых весь бизнес вертится вокруг продажи конкретных товаров. Если у вас обычная розничная продажа, то лучше сразу от этого отказаться, т.к. все равно рано или поздно будут добавляться новые типы товаров и ваша БД будет усложняться до момента потери контроля над ее структурой.
    Тут я предлагал решения для аналогичной проблемы: Как добавить товар в корзину?
    Ответ написан
  • Какой движок учётной (информационной) веб-системы выбрать?

    Несколько независимых рекомендаций
    1. Многие из перечисленных вами требований стандартны для большинства современных информационных систем, и предментными не являются. Вам стоит обдумать конкретные требования и конкретные ваши процессы на предприятии или в исследованиях. Если не считать некоторых продвинутых требований (история и разграничение доступа по классам), то вы и описали что-то вроде Access, которое как бы "подходит" для всего.
    2. Все-таки весьма сомнительно то, что вам нужна система для учета любых объектов, особенно с учетом того, что вы дали конкретное описание модели. Это бессмысленная цель, подобная система реально не упростит вам задачу. Вам стоит поставить конкретную задачу и автоматизировать ее. Невозможно получить что-то полезное на общем уровне, не вникая в детали. На общем уровне можно открыть Ворд или опять-таки Access, и забить в табличку данные.
    3. Если вам важна привязка к карте, посмотрите в направлении GIS-систем. Многие из них предлагают что-то похожее на ваши требования - создавать объекты с любым набором свойств (помимо геометрии). Только обычно клиентский софт в таких системах используется для работы именно с геометрией - все прочие операции автоматизируются отдельно (тут полезно хранить данные в СУБД общего назначения, классика жанра - PostgreSQL + PostGIS).

    P.S. Все-таки у вас видимо вполне конкретная задача, которую вы зачем-то пытаетесь обобщить. Система для учета любых объектов называется СУБД, а инструмент для выполнения операций и вычислений - языком программирования.
    Ответ написан
    Комментировать
  • Какой софт порекомендуете для работы с SQLite?

    sqlitestudio.pl - отличная вещь.
    Ответ написан
    Комментировать
  • Как добавить товар в корзину?

    Вам уже посоветовали использовать json, я попробую дать более общую рекомендацию. У вас стандартная для вашей предметной области проблема - отсутствие единой схемы данных, у вас имеющихся. Очень редко в работающем приложении кто-либо меняет схему "на ходу" - т.е. в 99% случаев схема (по кр. мере логическая) проектируется вместе с приложением. Новая версия приложения - новая схема (при необходимости, конечно). Таким образом, ваша задача диктует вам необходимость работать с ЧАСТЬЮ ваших данных без использования схемы. Согласитесь, это не очень гибко - заводить новую таблицу под каждый вид товара, коих огромное количество может быть. Самое главное, новые товары приходят каждый день, и каждый день добавлять таблицы - с ума сойдешь. И совершенно непонятно, как при этом разрабатывать SQL-запросы на выборку, учитывая все новые и новые таблицы.
    Т.о., часть данных вам лучше хранить иначе, а именно атрибуты ваших товаров. Тут подхода два: это либо полуструктурированные данные (semistructured), т.е. XML или JSON, либо EAV модель. Последняя является классическим выходом из ситуации при использовании реляционных баз данных, однако т.к. она по определению идет в разрез с реляционной структурой данных - это все по сути большой костыль. Сегодня все чаще рекомендуют первый вариант, т.к. во-первых многие современные РСУБД поддерживают JSON или XML типы данных, причем даже с возможностями валидации и выборки (а если и нет - BLOB всегда поможет), а во-вторых под каталог товаров можно использовать любую документную базу данных, которая кстати еще и лучше подойдет по специфике нагрузки на каталог (очень много чтения и мало записи, целостность не особо нужна - шардинг будет без особых проблем).
    Итого:
    1) понимаете, почему не все данные не всегда получается уложить в фиксированную схему
    2) выбираете себе подходящее решение из перечисленных, помня, что можно (и нужно!) часть данных хранить в нормализованном виде, а часть - не получится.
    3) поиск и выборка по ненормализованным данным рассматривается как отдельная задача
    P.S. вот как раз таки в корзину достаточно класть ID товара и его количество, что отлично уложится в реляционную схему. А для этого таблица товаров одна должна быть.
    Ответ написан
    8 комментариев
  • Каким должен LMS?

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

    Это я все как дилетант говорю, эл. обучением не занимался. Это то, что я бы хотел и ожидал увидеть в такой системе.
    Ответ написан
    2 комментария
  • C# - PostgreSQL Как работать с GridView?

    Nipheris
    @Nipheris Куратор тега C#
    Вам надо определиться с рядом требований к вашему приложению, в частности - на каком уровне абстракции оно работает с БД. Если на метауровне - т.е. для вашей программы нет ничего кроме набора неких таблиц и вьюх в базе (иными словами у вас чтото вроде стандартного шелла для работы с базой) - то это одна ситуация, и тут вам бы работать с INFORMATION_SCHEMA (чтобы без свитчей) и действительно собирать SQL-запросы самому. Если же у вас стандартные бизнес-задачи (создать запись о клиенте, заказе, ..., сохранить, отредактировать данные), и вы конкретно знаете, что у вас за таблицы и что там хранится, то почитайте про актуальные подходы к работе с данными в базах с использованием ORM, в случае дотнета - Entity Framework и NHibernate.
    Ответ написан
    Комментировать