Про базы данных

ych-group.ru — Коллеги, покритикуйте, подскажите - вдруг что забыл? Вдруг что не так написал?
Новости, Компьютеры | Del 15:10 08.09.2014
89 комментариев | 75 за, 4 против |
#1 | 15:13 08.09.2014 | Кому: Всем
А есть подобное для NoSQL баз данных?
#2 | 15:15 08.09.2014 | Кому: Пальтоконь
Не встречался. Но в целом - писал общие принципы. Сейчас приходится работать не с конкретной БД. а с разными, поэтому старался обобщать.
#3 | 15:15 08.09.2014 | Кому: Всем
Чесс говоря, я бы такими хинтами не руководствовался. Именование таблиц и полей идет в разрез с практиками в том же msdn.
#4 | 15:16 08.09.2014 | Кому: Del
> общие принципы

Для NoSQL всё несколько иначе. Хотя сейчас уже есть гибридные БД, которые умеют и так и сяк. Вроде бы даже Postgres и MySQL уже умеют.
#5 | 15:17 08.09.2014 | Кому: ins1der
> Именование таблиц и полей идет в разрез с практиками в том же msdn.

Дай линку плиз.
#6 | 15:17 08.09.2014 | Кому: Всем
Отличная статья, добавил в закладки, но скажите, коллега, есть ли у вас

[censored]
#7 | 15:19 08.09.2014 | Кому: Всем
Используй Elasticsearch
#8 | 15:20 08.09.2014 | Кому: zavhoz
Думаю дальше продолжить. Скорее всего, завтра выложу вторую часть.
#9 | 15:20 08.09.2014 | Кому: zavhoz
Ай-яй-яй юзать на вотте ЛММопротивный сленг лурки! :-)
#10 | 15:21 08.09.2014 | Кому: Del
> Думаю дальше продолжить. Скорее всего, завтра выложу вторую часть.

[Ставит будильник напоминалку]
#11 | 15:21 08.09.2014 | Кому: Пальтоконь
> Ай-яй-яй юзать на вотте ЛММопротивный сленг лурки! :-)

А что такое лурка? [я серьезно]
#12 | 15:21 08.09.2014 | Кому: Всем
> 6. Старайся работать с таблицами напрямую. ... Для обработки используй прокладки,

Взаимоисключающие параграфы?

> 9.2. ... если нет - добавляем, если есть - добавляем запись.


Смысловая описка? И так, и так добавляем, вместо "если нет - добавляем, если есть - обновляем".
#13 | 15:22 08.09.2014 | Кому: Всем
Ключевых полей может быть несколько - так называемые состваные ключи. Поэтому только id - уже не подойдет. В целом почитайте о Нормальных формах (НФ) для БД. 3-я нормальнай форма вполне подойдет для большой части проектируемых баз. Но если вы все же желаете попридираться то можно использовать форму Бойса-Кодда. Кроме того у вас ничего не написано про методы индексирования. Напрмер в большинстве случаев оптимальным будет использовать B-деревья.
#14 | 15:22 08.09.2014 | Кому: zavhoz
> А что такое лурка? [я серьезно]

Хорошая шутка!!!
#15 | 15:23 08.09.2014 | Кому: dse
А!! Опечатка! Сейчас поправлю. Спасибо.
#16 | 15:23 08.09.2014 | Кому: Всем
> create table LISTS

Используй единственное число в именах таблиц:
create table LIST
#17 | 15:25 08.09.2014 | Кому: Del
А п.6? Я его вообще не понял. Может быть, его следует переформулировать, или разбить на несколько?
#18 | 15:26 08.09.2014 | Кому: zavhoz
> А что такое лурка? [я серьезно]

На вотте запрещена даже к упоминанию. Сленг порицается модераторами и контингентом.
Ты лучше сам зугугли - прямо на нее и попадешь. Шапка из фольги и марлевая повязка рекомендуются. ;-)
#19 | 15:26 08.09.2014 | Кому: Пальтоконь
что-то общее не нахожу.

Так есть сайтик[censored]

там есть с пяток стандартных таблиц.

Например таблица Customers
Primary Key: CustomerID

Т.е. имя таблицы понятное и чаще всего в множественном числе, PK уже в единственном числе с добавлением ID на конце. Называть ID любой PK не есть гуд.
#20 | 15:27 08.09.2014 | Кому: Всем
А посоветуй, плиз, книгу по использованию и проектированию БД для начинающих. Интересует та в которой много практических примеров.
#21 | 15:27 08.09.2014 | Кому: Mellcorn
Да я в курсе... Просто с нынешней работой достаточно одного ID (там такое иногда увидеть приходятся, что ни в сказке сказать, ни носом почуять). Вот, пытаюсь продвинуть хоть какие-то правила разработки.
#22 | 15:29 08.09.2014 | Кому: Mellcorn
> Кроме того у вас ничего не написано про методы индексирования. Напрмер в большинстве случаев оптимальным будет использовать B-деревья.

Нельзя ли привести перечень параметров команды CREATE INDEX для указания метода индексирования? /me инженер-системотехник по АСОиУ, знаю всё, но неглубоко!!! Потому и интересуюсь.
#23 | 15:30 08.09.2014 | Кому: Shifu
> Используй единственное число в именах таблиц:

А почему? Нет, правда, интересно.
#24 | 15:31 08.09.2014 | Кому: Всем
> Используй единственное число в именах таблиц:

особенно для таблицы News, ага.
#25 | 15:32 08.09.2014 | Кому: Mellcorn
> Напрмер в большинстве случаев оптимальным будет использовать B-деревья.

[вспоминает лабы по балансированию В-деревьев больших порядков, вздрагивает]
#26 | 15:33 08.09.2014 | Кому: Пальтоконь
Заплыв в обсуждения статей - исключительно в ОЗК, и только с изолирующим противогазом с чОрными стеклами, чтобы не ослепнуть от ярчайшего накала ПравдыЪ!!!
#27 | 15:34 08.09.2014 | Кому: dse
Ну, если в двух словах - не надо даже своим приложением лезть в данные. Следует разделять логику работы приложения и работы с данными. Приложение должно только постучаться к БД и сказать - "вот, хочу получать такие данные" или "хочу поменять такие данные". А уж как их получать или менять - пусть с этим разбирается БД
#28 | 15:36 08.09.2014 | Кому: ins1der
> особенно для таблицы News, ага.

А это нехорошее название для таблицы. Хорошее будет MESSAGE
#29 | 15:41 08.09.2014 | Кому: Mellcorn
> 3-я нормальнай форма вполне подойдет для большой части проектируемых баз. Но если вы все же желаете попридираться то можно использовать форму Бойса-Кодда.

Нормальные формы эт конечно удобно и красиво. Но ждать выполнения запроса с 3-5 join'ами на таблицах с сотнями тысяч записей несколько грустно.
#30 | 15:43 08.09.2014 | Кому: Всем
>2. Ключевое поле должно называться ID и никак иначе! Поле, содержащее наименование сущности, описываемой данной таблицей, должно называться CAPTION
>Пояснение. Единый принцип именования полей сокращает время на написание запросов и изучение структуры БД. Я думаю, это понятно всем, но указать всё-таки надо. А почему именно CAPTION, а не NAME? См. следующий пункт.

В запросах с иннер джойнами потом возможны проблемы. Плюс, если использовать например CustomerID а не ID в случае связи двух таблиц, имена полей в главной и дочерней таблице будут совпадать (CustomerID ), что опять же облегчит понимание и написание запроса.

>4. Не забывай про внешние ключи. Не следует рассчитывать на то, что с данной БД будет работать только твоя программа, и уж в ней-то точно будут вводиться только правильные данные. Если делаешь ссылку на другую таблицу - не ленись, создай внешний ключ. Целостность данных - наше всё. Не надо делать помойку из базы данных.


Помимо внешних ключей ещё надо не забывать создавать индексы по этим полям в дочерних таблицах, что существенно ускорит джойн.
#31 | 15:47 08.09.2014 | Кому: Del
> Ну, если в двух словах - не надо даже своим приложением лезть в [таблицы напрямую INSERTами и UPDATEми].

Да я это понял, и целиком и полностью согласен. У тебя в п.6 отсутствует "не" в первом предложении. Поэтому получились взаимоисключающие параграфы. Должно быть как-то так:

> 6. Старайся [не] работать с таблицами напрямую.


Я бы изложил п.6 следующим образом.

6. Приложение не должно использовать операции для работы непосредственно с таблицами (TABLE). Вместо этого, выборка данных из БД должна осуществляться приложением только из представлений (VIEW), а обновление данных должно выполняться путём вызова встроенных процедур БД.


Одна беда, не все СУБД поддерживают встроенные процедуры. Вот SQLite, например, не поддерживает, и для него п.6 выполнить не получится :(
#32 | 15:49 08.09.2014 | Кому: pavelat
> ждать выполнения запроса с 3-5 join'ами на таблицах с сотнями тысяч записей несколько грустно

Индексы по полям, по которым выполняется join, уже не помогают?
#33 | 15:49 08.09.2014 | Кому: Utgart
> Плюс, если использовать например CustomerID а не ID в случае связи двух таблиц, имена полей в главной и дочерней таблице будут совпадать (CustomerID ), что опять же облегчит понимание и написание запроса.

1. Алиасы рулят
2. В таблице, на которую ссылаешься (в нашем случае - CUSTOMERS) ключевое поле зовется ID

from ORDERS O
left join CUSTOMERS C on (O.CUSTOMER_ID = C.ID)
#34 | 15:53 08.09.2014 | Кому: Del
Потому что каждая таблица содержит один объект (единственное число) инфологической модели, но несколько (множественное число) экземпляров этого объекта, по одному экземпляру в одной строке таблицы.
#35 | 15:53 08.09.2014 | Кому: dse
> У тебя в п.6 отсутствует "не" в первом предложении.

Уже подсказали, уже исправил, но всё равно - спасибо.

> Одна беда, не все СУБД поддерживают встроенные процедуры. Вот SQLite, например, не поддерживает, и для него п.6 выполнить не получится :(


:(
#36 | 15:53 08.09.2014 | Кому: Всем
Зачем на вотт ссылки на сугубо программерские материалы?
#37 | 15:53 08.09.2014 | Кому: Всем
А эти советы для каких условий? для хайлода они подходят?
#38 | 15:58 08.09.2014 | Кому: dse
Обрати внимание на структуру тех двух таблиц, которые приведены в примере: LISTS содержит информацию, сходную по структуре, но разную по содержанию. Т.е., в LISTS могут содержаться как списочные данные об адресах, так и о породах кроликов в Новой Зеландии - всё зависит от LIST_TYPES_ID
#39 | 16:00 08.09.2014 | Кому: gramsci
А вот про нагруженность и будет вторая заметка. Тут - только пара моментов про нагрузку на сервер БД, во второй части - будет более подробно изложено.
#40 | 16:04 08.09.2014 | Кому: Del
> from ORDERS O
> left join CUSTOMERS C on (O.CUSTOMER_ID = C.ID)

А потом ты вставишь в этот запрос ещё одну таблицу D, в которой тоже есть поле ID, в результате правки перепутаешь C.ID и D.ID в отношении ON и будешь долго тупить на пустой результат выполнения запроса.

А вот если в С и D имена полей ID будут разными, то конструкция O.CUSTOMER_ID = D.DERIVATIVE_ID (например) чётко укажет тебе на источник ошибки. Более того, тебе даже в голову не придёт такое написать. А если ты напишешь C.DERIVATIVE_ID, тебе на эту твою ошибку укажет уже СУБД, как на отсутствие поля DERIVATIVE_ID в таблице CUSTOMERS.
#41 | 16:04 08.09.2014 | Кому: Dliv227
> Зачем на вотт ссылки на сугубо программерские материалы?

Соскучился но укроновостям? :-)

Мы тут на вотте все разные и все ссылками обмениваемся. Паркуа бы и не па?
#42 | 16:06 08.09.2014 | Кому: Del
> А почему? Нет, правда, интересно.

В обчем, можно и так, и эдак. На любителя.
#43 | 16:07 08.09.2014 | Кому: Dliv227
> > Зачем на вотт ссылки на сугубо программерские материалы?

Не у всех есть доступ на программерские ресурсы с пре/постмодерацией?
#44 | 16:08 08.09.2014 | Кому: ins1der
> особенно для таблицы News, ага.

NewsItem
#45 | 16:19 08.09.2014 | Кому: dse
Ну, как бы это сказать...

Начинал я (ну, и до сих пор в своих личных проектах юзаю - почти первая любовь 60) Interbase/Firebird. Там была шикарная IDE - IBExpert называется, возможно, встречал. В ней можно было посмотреть зависимости для каждой таблицы. На кого эта таблица ссылается, кто ссылается на неё...

Потом занялся ораклом. В конторе, где я трудился, использовался PL/SQL Developer Express. Конечно, мог многое, но не так, как я привык. Пришлось написать своё. В самопальной фиговинке - опять отдавались все зависимости.

Затем - MS SQL. Использовал MSSQL Manager. Он тоже выдавал зависимости. Жить было еще можно.

А вот сейчас юзаю MySQL. Ненавижу эту недоСУБД уже давно, но наиболее плотно с ней пришлось заняться вот прямо сейчас.
Подскажи мне, вдруг я чего-то не знаю - как выяснить с первого взгляда, на какую таблицу ссылается поле DERIVATIVE_ID, если нет таблицы DERIATIVE?
#46 | 16:21 08.09.2014 | Кому: Shifu
>> особенно для таблицы News, ага.

> NewsItem


Имею мнение, что это идеологически неверно.

Item - это единичный экземпляр.

То есть ЧеготоItem - это экземпляр сущности Чегото. Таблица, представляющая совокупность (коллекцию, множество) всех экземпляров объекта, так называться не может. Именем ЧеготоItem можно, например, назвать курсор во встроенной процедуре, который будет пробегать в цикле по всем записям таблицы Чегото.
#47 | 16:25 08.09.2014 | Кому: Del
А с чего лучше начать изучение с PostgreSQL или MySQL?
#48 | 16:29 08.09.2014 | Кому: dse
> Индексы по полям, по которым выполняется join, уже не помогают?

Без них вообще страшно. Особенно когда там двойное - тройное вложение. Типа документ - клиент - адрес. А в некоторых документах у меня энтих клиентов 3.
#49 | 16:32 08.09.2014 | Кому: gramsci
> А с чего лучше начать изучение с PostgreSQL или MySQL?

С теории реляционных БД))
#50 | 16:32 08.09.2014 | Кому: gramsci
Ну, я не мега-эксперт, могу только свою точку зрения изложить. Дальше сам смотри.
PostgreSQL. Это если из двух предложенных к сравнению.
Войдите или зарегистрируйтесь чтобы писать комментарии.