Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проектирование базы данных

40K
31 июля 2010 года
himas
31 / / 13.11.2009
Доброго времени суток, мне необходимо мнение/совет человека, имеющего опыт в проектировании баз данных.

Работа с БД происходить слеюущим образом:

1. Для каждого нового пользователя создается таблица-каталог вида:
cat1
___
* id
* name
* descr
* category
* something


2. Данные таблиц пользователей заносятся в общую таблицу вида:
base
___
* id
* name
* descr
* category
* owner

Принцип импортирования: ищем cat1.name среди base.name
* если записи не существует - создаем
* если существует - добавляем в поле base.owner - id из названия таблицы (cat1 -> добавляем 1)


3. Во время работы возникнет необходимость по base.id вытаскивать cat1.something для каждого base.owner

Пользовательских таблиц cat будет несколько десятков. Из base owner будут браться id (их может быть несколько), через которые будут происходить обращения к нужным таблицам (1 -> cat1).

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


4. Мы определили таблицы, теперь необходимо найти внутри них нужную запись. Я собираюсь искать ее по совпадению base.name - catN.name.



На этом все, я уверен, что необходимые записи я найду, но я не уверен в рациональности поиска по текстовому полю name в пункте 4 и поиску таблицы в пункте 3.

Просьба скажите, что вы думаете по поводу данной реализации и как мне следует оптимизировать схему?

Спасибо за внимание.
1
31 июля 2010 года
kot_
7.3K / / 20.01.2000
Сказать что либо по поводу схемы не возможно, не понимая чего вы хотите добится.
Например - зачем создавать отдельную таблицу?
385
01 августа 2010 года
SomewherSomehow
477 / / 25.07.2004
Не знаю ваших конечных целей, но скажу сразу, что подход при котором кол-во таблиц завязывается на такую меняющуюся величину, как кол-во пользователей - плохой подход. Не реляционный.
Вам лучше перепроектировать свою БД таким образом, чтобы пользователю соответствовала строка/строки в таблице а не отдельная таблица. Напрмер сделайте постоянную таблицу структуры cat1 и добавьте туда еще одно поле catID, в котором будет храниться принадлежность группы строк к определенному пользователю. Это позволит вам избежать динамического sql, позволит создать на таблице нормальные индексы и вообще убережет от таких извратов как сейчас =)
40K
01 августа 2010 года
himas
31 / / 13.11.2009
У каждого пользователя в каталоге будет несколько десятков тысяч записей. Периодически эти записи будут обновляться, отдельные таблицы делаю для того, чтобы не заморачиваться с очисткой таблицы, а полностью удалять ее содержимое и заполнять заного.

SomewherSomehow, ваш вариант вполне приемлимый и действительно реляционный, надеюсь, особой потери производительности от перехода с drop table до очистки записей по catID не будет.
385
01 августа 2010 года
SomewherSomehow
477 / / 25.07.2004
Не волнуйтесь, для более менее серьезной субд, несколько десятков тысяч записей - не проблема. Некоторые таблицы запросто измеряются десятками миллионов и то, считаются не такими уж большими. И потом при создании-удалении таблиц скорее всего будут наклядываться более строгие блокировки, чем при удалении строк.
Самое главное правильно организовать индексы в таблице.
Удачи!
63
01 августа 2010 года
Zorkus
2.6K / / 04.11.2006
ТС не указал СУБД. Лучше былоб указать.
6
01 августа 2010 года
George
4.1K / / 05.01.2007
А смысл? Мне почему-то сейчас подумалось, что разрабатывать структуру БД лучше таки не привязываясь к определенной СУБД, хотя может я и неправ.
9.9K
03 августа 2010 года
maxFM
77 / / 18.04.2007
Для того чтобы не заморачиваться с удалением данных из БД при удалении пользователя существует схема данных защита целосности подчиненных записей. Если поставить в настройках связей между таблицами автоматическое удаление подчиненных записей при удалении главной то они все будет как Вам надо
создаете таблицу
Pers
 
Код:
Pers_id
 name
descr
category
something

Создаете таблицу записей
rec_tab
 
Код:
rec_id
id_pers
descr
category

Поля Pers_id и Rec_id являются уникальными в своих таблицах и их записи не могут повторятся
Записи Поля id_pers могут повторятся но в данном поле не может быть таких значений которых нет в поле Pers_id
создаете связь можду таблицами Pers_id<->id_pers (один ко многим) и ставите галку о проверки целосности и автоматическом удалении данных и подчинненной таблицы.
И все.
Записи в таблице Res_tab от определнного пользователя ищутся запросом по полю id_pers.
При удалении из таблицы Pers пользователя удаляются все его записи из таблицы Rec_tab
Удачи!!!
385
04 августа 2010 года
SomewherSomehow
477 / / 25.07.2004
Только к скорости и производительности это не имеет никакого отношения.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог