Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация базы данных, Советы знатоков 
:(
    Опции темы
ProESM
Дата 27.8.2010, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Приветствую всех и каждого!

Перейду сразу к делу.

Цель: создать приложение (сервер-клиенты) для организованной работы коллектива посредством заявок.

Задача: составить грамотную БД, а именно
-Удобство размещения данных;
-Быстродействие;
-Независимость от СУБД (хотя создавать буду все в MySQL) и/или инструмента программирования;
-Простота работы с БД.

Данные:
Итак, в организации много отделов и сотрудников. Имеется хоть и не большая, но все же текучка кадров. От многочисленной (объемной, количественно большой) суетливой работы многие не успевают или забывают сделать то, что им необходимо сделать. Пытаются записывать на листочках, запоминать, вносить в текстовый файлик на компьютере - но все это все равно примитивно и неэффективно.
Задачи, стоящие перед сотрудниками, разная: от заправки катриджа принтера до исправления нарядов на производстве. Время на исполнение той или иной задачи (заявки) тоже разное (переменной, постоянное), от времени (ну и конечно других параметров) зависит состояние заявки (не начата, в процессе выполнения, завершенная, отложеннная, ожидание другого пользователя). Заявка в своб очередь имеет целый жизненный цикл: публикация (заявитель размещает заявку), регистрация (секретарь, диспетчер или другое уполномоченное лицо фиксирует публикацию заявки, определяет категорию заявки, исполнителя, примерный срок выполнения и др.), исполнение (исполнитель выполняет назначенную ему информацию. К тому же, исполнение может происходить по следующим сценариям: сразу выполняется и завершается; исполнитель просит пояснений, после чего ожидает пояснения и по получению разъяснений от заявителя начинает выполнять) и администрирование (администратор, наверное буду я , выполняет некоторые действия: отчеты по заявкам, проверка исполнений, исправление ошибок регистратора и др.).
К тому же, заявка обладает рядом параметров: id, название, описание, дата публикации, дата регистрации, срок выполнения, дата завершения, комментарии исполнителя, важность, категория, заявитель, исполнитель, регистратор и др.
База данных также должна учитывать и некоторую информацию о сотрудниках: id, ФИО, дата рождения, дата регистрации, дата приема на работу, отдел, должность, роль в приложении (администратор, исполнитель, регистратор, публикатор) и др.

Вкратце попытался донести смысл, надеюсь получилось 

Идей пока две:
1) плохая, отвратительная, неправильная, убогая - все в одну таблицу свести;
2) вроде логичная:
Под списки значений выделяется отдельная таблица (роль в приложении, отдел и др.) + промежуточная таблица (связывает некоторые параметры, к примеру, таблица сотрудников с данными по ним) + общая бд, хранит всю информацию по заявкам.

Прилагаю файл БД Access 2003, где накидал приблизительную БД.

Прошу помочь и поставить на путь истинный в плане организации БД.

Заранее всем спасибо!

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  bd.rar 31,86 Kb
PM MAIL   Вверх
world
Дата 28.8.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: нет
Всего: 12



Самой лучшей идеей, является приведение базы данных в третью нормальную форму.

Ещё хочу дать следующий совет. Нежелательно, чтобы первичный ключ был текстовым, поскольку в данном случае не обеспечивается быстродействие . В этом случае лучше ввести дополнительное поле id и связывать таблицы именно по нему. А для вывода текстовой информации использовать представление.

Первую идею отметаем сразу же, поскольку это 1 нормальная форма.
Вторая - уже ближе к истине. Однако возникает вопрос, возможно ли, что у заявки будет несколько исполнителей, заявителей регистраторов. Также при просмотре Вашей БД заметил, что таблица отдел не связана не с какой другой таблицей, а должна быть связана с таблицей Пользователи (по полю id, которое у Вас я думаю появится). Поля Кому, От кого таблицы Заявки тоже должны быть связаны с таблицей Пользователи. Абсолютно не понял назначение таблицы Доступ к программе, вместо неё просто в поле записываем логическое значение и всё.

Цитата

К тому же, заявка обладает рядом параметров: ... дата публикации,... регистратор

То ли плохо искал, то ли этих полей в Вашей БД не обнаружил.
В общем доработать ещё есть что. Но пока Вы на правильном пути.
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
ProESM
Дата 28.8.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Спасибо за совет, world!

Добавил небольшую нормализацию. Прикрепляю скрин схемы связей

Это сообщение отредактировал(а) ProESM - 28.8.2010, 15:46

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  _____.png 52,13 Kb
PM MAIL   Вверх
world
Дата 28.8.2010, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: нет
Всего: 12



Не могу понять, что делает индекс должности в таблице отдел.
Ведь тогда получается, что в одном отделе может быть ТОЛЬКО одна должность,
Если Вы хотите, соотнести, что в отделе могут быть только некоторые должности необходимо сделать следующую структуру, как можно увидеть в прикреплённом файле.

Да и если оставлять такую структуру как у Вас, то Индекс должности необходимо убирать из таблицы Пользователи, иначе происходит повтор данных, чего нельзя допускать в БД.

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  1.JPG 26,32 Kb
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
ProESM
Дата 28.8.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Т.е. получается что-то типа этого (в прикрепленном файле)?

Насчет дублирования инфы я не понял, где она там у меня дублироваться будет?



Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Schema.png 53,41 Kb
PM MAIL   Вверх
world
Дата 28.8.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: нет
Всего: 12



Что касается дублирования инфы, то "Индекс должности" храниться в 2 СВЯЗАННЫХ между собой таблицах Пользователи и Отдел и соответственно может быть получен с помощью запроса.

Представим себе ситуацию, что у нас есть индекс пользователя и мы хотим узнать индекс его должности. мы можем это сделать 2(!) запросами к разным таблицам.

Код

SELECT Пользователи.'Индекс должности' 
FROM Пользователи 
WHERE Пользователи.'Индекс пользователя' = ?


и

Код

SELECT Отдел.'Индекс должности' 
FROM Пользователи, Отдел 
WHERE Пользователи.'Индекс пользователя' = ? 
AND Пользователи.'Индекс отдела' = Отдел.'Индекс отдела'


Следовательно индекс должности в таблице пользователи дублирует индекс должности в таблице отдел. Кстати, по ошибке вполне реально указать одному пользователю разные Индексы должности в таблицах, и какой из них считать истинным - загадка.

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

Это сообщение отредактировал(а) world - 28.8.2010, 20:44

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  1.PNG 53,41 Kb
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
ProESM
Дата 28.8.2010, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



Спасибо, все понял, отлично получилось!!! Результат труда потом выложу на обозрение. Покритикуете ))
PM MAIL   Вверх
skyboy
Дата 28.8.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Цитата(world @  28.8.2010,  19:41 Найти цитируемый пост)
Следовательно индекс должности в таблице пользователи дублирует индекс должности в таблице отдел.

сотрудник может работать на полставки? а совмещать две разные должности в разных отделах?
PM MAIL   Вверх
Akina
Дата 28.8.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Я не понимаю - а зачем изобретать велосипед, когда существует масса готовых программных комплексов с описанным функционалом?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ProESM
Дата 29.8.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.3.2008

Репутация: нет
Всего: нет



По разработанной соместно с world схеме базы данных создал SQL запрос. Все работает шикарно, единственный вопрос, что индексировать, какие поля каких таблиц (для ускорения работы). Жду советов. Заранее спасибо!
Код

CREATE TABLE tr_importance (                          
    r_importance_id INT NOT NULL UNIQUE KEY,         
    r_importance_importance VARCHAR(255),             
    PRIMARY KEY(r_importance_id)                    
) ENGINE = InnoDB;                                  

CREATE TABLE tr_category (              
    r_category_id INT NOT NULL UNIQUE KEY,        
    r_category VARCHAR(255),             
    PRIMARY KEY(r_category_id)
) ENGINE = InnoDB;

CREATE TABLE tr_state (              
    r_state_id INT NOT NULL UNIQUE KEY,        
    r_state VARCHAR(255),             
    PRIMARY KEY(r_state_id)
) ENGINE = InnoDB;

CREATE TABLE tu_type (              
    u_type_id INT NOT NULL UNIQUE KEY,        
    u_type VARCHAR(255),             
    PRIMARY KEY(u_type_id)
) ENGINE = InnoDB;

CREATE TABLE tu_department (              
    u_department_id INT NOT NULL UNIQUE KEY,        
    u_department VARCHAR(255),             
    PRIMARY KEY(u_department_id)
) ENGINE = InnoDB;

CREATE TABLE tu_profposition (              
    u_profposition_id INT NOT NULL UNIQUE KEY,        
    u_profposition VARCHAR(255),             
    PRIMARY KEY(u_profposition_id)
) ENGINE = InnoDB;

CREATE TABLE tu_workplace (              
    u_workplace_id INT NOT NULL UNIQUE KEY,        
    u_workplace_department_id INT NOT NULL,
    u_workplace_profposition_id INT NOT NULL,             
    PRIMARY KEY(u_workplace_id),
    FOREIGN KEY (u_workplace_department_id) 
        REFERENCES tu_department(u_department_id)
        ON UPDATE CASCADE                    
        ON DELETE RESTRICT,                  
    FOREIGN KEY (u_workplace_profposition_id) 
        REFERENCES tu_profposition(u_profposition_id)
        ON UPDATE CASCADE                   
        ON DELETE RESTRICT                 
) ENGINE = InnoDB;

CREATE TABLE tu_general (              
    u_general_id INT NOT NULL AUTO_INCREMENT,        
    u_login VARCHAR(255) UNIQUE KEY, 
    u_password VARCHAR(255),
    u_lastname VARCHAR(255),
    u_name VARCHAR(255),
    u_patronymic VARCHAR(255),
    u_general_workplace_id INT NOT NULL UNIQUE KEY,
    u_general_type_id INT NOT NULL UNIQUE KEY,
    u_registration DATETIME NOT NULL,           
    u_update DATETIME NOT NULL,
    u_birthday DATE NOT NULL,
    u_access BOOLEAN,
    PRIMARY KEY(u_general_id),
    
    FOREIGN KEY (u_general_workplace_id) 
        REFERENCES tu_workplace(u_workplace_id)
        ON UPDATE CASCADE                    
        ON DELETE RESTRICT,                 
        
    FOREIGN KEY (u_general_type_id) 
        REFERENCES tu_type(u_type_id)
        ON UPDATE CASCADE                
        ON DELETE RESTRICT                   
    
) ENGINE = InnoDB;

CREATE TABLE tr_general (              
    r_general_id INT NOT NULL AUTO_INCREMENT,        
    r_name VARCHAR(255),
    r_general_category_id INT NOT NULL,              
    r_general_importance_id INT NOT NULL,            
    r_general_state_id INT NOT NULL,                 
    r_general_performer_id INT NOT NULL,             
    r_general_applicant_id INT NOT NULL,             
    r_general_registrator_id INT NOT NULL,          
    r_description VARCHAR(255),
    r_registration DATETIME NOT NULL,           
    r_begindate DATETIME NOT NULL,
    r_termdate DATETIME NOT NULL,
    r_enddate DATE NOT NULL,
    r_comments VARCHAR(255),
    r_attachments VARCHAR(255),
    PRIMARY KEY(r_general_id),

    FOREIGN KEY (r_general_category_id) 
        REFERENCES tr_category(r_category_id)
        ON UPDATE CASCADE                 
        ON DELETE RESTRICT,              
        
    FOREIGN KEY (r_general_importance_id) 
        REFERENCES tr_importance(r_importance_id)
        ON UPDATE CASCADE                  
        ON DELETE RESTRICT,                 
        
    FOREIGN KEY (r_general_state_id) 
        REFERENCES tr_state(r_state_id)
        ON UPDATE CASCADE                   
        ON DELETE RESTRICT,              
        
    FOREIGN KEY (r_general_performer_id) 
        REFERENCES tu_general(u_general_id)
        ON UPDATE CASCADE                 
        ON DELETE RESTRICT,               

    FOREIGN KEY (r_general_applicant_id) 
        REFERENCES tu_general(u_general_id)
        ON UPDATE CASCADE                  
        ON DELETE RESTRICT,               
        
    FOREIGN KEY (r_general_registrator_id) 
        REFERENCES tu_general(u_general_id)
        ON UPDATE CASCADE                   
        ON DELETE RESTRICT,                   
            
) ENGINE = InnoDB;

PM MAIL   Вверх
Frees
Дата 29.8.2010, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 2
Всего: 54



первичный и внешний ключи
а потом уже надо анализировать типичные запросы, время выполнения которых не устраивает....


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0836 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.