Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Как грамотно составить БД

По-моему, задача тривиальная, но я чего-то торможу...
Есть таблица tab_Organizations. В ней должны содержаться сотрудники,
поставляемые, требуемые товары и ещё куча разных данных типа
местоположения. Хранить всё в одной базе неэкономно и поэтому я решил
делать что-то типа указателей. Т.е. есть товар "карандаш", он может
быть товаром для кучи разных фирм и хранить для каждой его имя не
очень экономно, поэтому я сделал другую таблицу tab_Goods в которую
вывел все товары с индивидуальным id.
Тоже самое с сотрудниками - для них есть отдельная таблица с кучей
инфы.
Теперь надо включить id товаров и сотрудников в таблицу Organization.
Первое, что мне пришло в голову это добавить поле, к примеру, workers
и туда через запятую запихнуть номера людей. Однако, если в таблице
людей будет больше чем тысяча, то указатель вместе с запятой будет
занимать уже на один байт больше, чем ему положено (в идеале четыре
байта, а на деле получиться 1001,1015,2045 и т.п. - пять байт на
одного сотрудника или товар), следовательно поле MEMO, которое должен
иметь соот-щий столбец будет бухнуть прямо на глазах.
Вопросы:
1. На правильном ли я пути - нет ли каких-то стандартных способов
составлять списки?
2. Если включить указатели бинарно (т.е. чтобы и единица и 100 000
занимали лишь четыре байта) можно ли будет заставить sql искать четыре
байта с шагом в четыре байта (т.е. чтобы он не обращал внимание на
возможные совпадения на стыках байт - запятых же уже не будет)?

P.S.
Если это имеет значение: прогу пишу на VB.Net Express 2005, MS SQL.

P.S.
Прога будет работать на городской справочной неизвестное количество
времени и база расти несомненно будет, поэтому если уж не количество
сотрудников, то количество товаров точно будет немаленьким.

Номер выпуска : 5153
Возраст листа : 865 (дней)
Количество подписчиков : 549
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/510001
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 3 Feb 2006 00:41:29 +0500 (#510001)

 

Ответы:

Здравствуйте, Neco,

Согласен - тривиальная.

Сразу уточним: В одной ТАБЛИЦЕ или в одной БАЗЕ? Судя по тому, что ты
сказал у тебя база состоит из одной таблицы, в которую все впихнуто.

Не надо. Это еще больший геморой.
Обычно делают связанные поля:
1. Таблица Товар - Номенклатуру товара содержит:
КОД товара - число
Название - строка
...прочие поля...

2. Таблица Фирма - содержит описание фирм:
КОД - число
...прочие поля... - Название, Адрес, телефон, и т.д.

3. Таблица товары фирмы
КОД ФИРМЫ
КОД ТОВАРА
Цена
...прочие поля...

Это структура БД. А вот формировать списки будешь в интерфейсе
пользователя.
Например: нужно добавить к фирме товар.
- Работаем с таблицей 3
- КОД фирмы выбираем из списка по таблице 2.
- КОД товара выбираем из списка по таблице 1.
Все!!

Ответить   Fri, 3 Feb 2006 09:03:40 +0500 (#510174)

 

Нет, таблицы разные. База одна.

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

Не понял. Нельзя ли пояснить на примере SELECT? К примеру, я хочу
найти все товары одной фирмы.
Если у меня таблица товара фирмы содержит код фирмы, это значит, что у
меня будет несколько одноимённых товаров в одной таблице?
Или же каждой фирме выделять отдельную таблицу? Но тогда зачем
указывать в этой таблице код фирмы?

Чтобы не было неразберихи поясняю как я хотел:
(пунктиры означают разные столбцы)
Таблица ФИРМА:
1-ТОО Пупкин и Ко-,1,2,4,5,
2-ЧП Иванов-,3,4,5,

Таблица ТОВАР:
1-ручка дверная-2 руб.
2-окно-3 руб.
3-дверь-4 руб.
4-линолеум-5 руб.
5-шкаф-6 руб.

Как видите, товары не повторяются и это плюс, от которого я не хочу
отказываться. Поиск всех товаров одной фирмы (довольно частая
операция, как мне кажется) осуществляется разложением строки в
указатели на строки в другой таблице. Поиск всех фирм, поставляющих
данный товар, осуществляется по строкам ",2," или там ",1,"...
Добавление и изменение это, конечно, посложнее - придётся разбирать и
собирать каждый раз строку - может даже начать тормозить, если какой
гигант попадётся.
Если можно, приведите пример Вашего способа на небольших таблицах.

Большое спасибо за отклик!

Номер выпуска : 5156
Возраст листа : 866 (дней)
Количество подписчиков : 548
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/510357
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 03 Feb 2006 16:42:04 +0300 (#510357)

 

Здравствуйте, Николай,

Ну-у, аналогия тут условная. Судя по всему таблицы практически не
связаны. Если в таблице Фирма, в одном поле будут перечисляться все
коды товаров - то не есть гуд. Сложно работать, да и непредсказуемый
объем данных.

Select * from Tab_Tovar where Код_Фирма=.... - выдаст таблицу кодов
товаров данной фирмы.

НЕТ! Есть таблица НАИМЕНОВАНИЙ ТОВАРОВ и таблица ТОВАРОВ ФИРМ
Структура связей.
1 N N 1
Наименования --> Товары <-- Фирмы
Связь между таблицей "Наименования товара" и таблицей "Фирмы"
многие-ко-многим. Таблица "товары" является связующей + несет
дополнительную информацию, например цена. Один и тот-же товар у разных
поставщиков может иметь разную цену.

Схема условная, ниразу в торговле не работал!:))

Сам ответил на вопрос. Таблица "Фирмы" для всех фирм.

В моем случае повторение сводится к минимуму.
Таблица ФИРМА:
КОД |Наименование
1 |ТОО Пупкин и Ко
2 |ЧП Иванов

Таблица НАИМЕНОВАНИЙ ТОВАРОВ
КОД | Наименование
1 |ручка дверная-2 руб.
2 |окно-3 руб.
3 |дверь-4 руб.
4 |линолеум-5 руб.
5 |шкаф-6 руб.

Таблица ТОВАРЫ - вот тут и дублируется код фирмы и код товара.
КодФирмы | КодТовара | Цена - может быть разной!!
1 1 2
1 2 3
1 4 5
1 5 6
2 3 2.1
2 4 4.9
2 5 6

Зато запросы на выборки предельно просты. :)

Ответить   Tue, 7 Feb 2006 08:30:22 +0500 (#511888)

 

Тьфу, ё-маё!
Понял!
Спасибо большое, вопрос снят. 8)

Номер выпуска : 5157
Возраст листа : 866 (дней)
Количество подписчиков : 548
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/510377
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 03 Feb 2006 16:44:34 +0300 (#510377)

 

Neco пишет:

Как все запущено :)

Вообще-то вам сюда:
http://www.jetinfo.ru/1995/3-5/1/rdbms.basics.html
http://www-sbras.nsc.ru/win/docs/db/rdbms/3-2.html
http://webmaster.sbridge.ru/wm11.php
http://www.sql.ru/docs/sql/u_sql/ch1.shtml
http://spslug.sposad.ru/doc/postgres/tutorial/sql.html
http://www.cs.ifmo.ru/education/documentation/sql_kg/1-1.shtml

и т.д. по тексту....

Ответить   Oleg Ponomarev Fri, 03 Feb 2006 12:06:09 +0200 (#510524)

 

Neco пишет:

Я не понимаю, чем вас не устраивает внешний ключ? К чему вся эта
самодеятельность?

Номер выпуска : 5159
Возраст листа : 866 (дней)
Количество подписчиков : 548
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/510525
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 03 Feb 2006 08:40:32 +0600 (#510525)

 

Привет Neco,

Вы мне письмо написали 2 февраля 2006 г. (четверг), а я Вам отвечу вот что:

Правильное решение

Путь не совсем правильный

На мой взгляд:
Таблица Товар:
*IDWares
NameWares
Таблица Сотрудник
*IDPeople
NamePeople
Таблица Organization
*IDOrganization
Доп. информация
Таблица WaresInOrganization
*IDOrganization
*IDWares
Доп. инфо
Таблица PeopleInOrganization
*IDOrganization
*IDPeople
Доп. инфо

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

P.S. Почитайте что-нибудь про третью нормальную форму БД - поможет

Афоризм 1: Учиться, как и лечиться, никогда не поздно... Только иногда бесполезно...

Афоризм 2: Аттракцион российской эстрады: голубизна и серость одновременно.
3 февраля 2006 г. 22:04:45

Просто студент и САПРист
Eugene mailto:rav***@o*****.ru
ICQ: 291-819-230
Web: www.hallo.nm.ru

Номер выпуска : 5162
Возраст листа : 867 (дней)
Количество подписчиков : 547
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/510668
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 3 Feb 2006 22:12:38 +0300 (#510668)