1

Тема: MySQL БД працівники

Всім вітання. Роблю простеньку БД, про працівників. Наразі все "поміщається" в одну таблицю:
ПРАЦІВНИКИ
- табельний номер (використовується, як ID)
- прізвище
- ім'я
- по батькові
- професія
- група з електробезпеки
- дата прийняття
- зріст
- вага
- розмір взуття
- розмір одягу
- день народження
- телефон

І ось поле професія змушує задуматися: начальник, зав. складу, інженер (провідний інженер, інженер I, інженер II, інженер), електромонтер (від III до VI розряду). Тобто є професії, які мають додаткові "вказівки". Думав робити окрему таблицю ПРОФЕСІЇ, але ж в інженерів розрядів не має, за те є категорії, а зав скад - просто зав склад.. Підкажіть будь-ласка, як краще зробити.

2

Re: MySQL БД працівники

Намалюйте декілька колонок категорії властивості і так далі. а тоді до кожної додлайте первинний ключ спробуйте з’єднати . в мене так завжди виходить

Junior Django Developer

3 Востаннє редагувалося fed_lviv (06.07.2015 20:19:01)

Re: MySQL БД працівники

Blast написав:

Намалюйте декілька колонок категорії властивості і так далі. а тоді до кожної додлайте первинний ключ спробуйте з’єднати . в мене так завжди виходить

Трошки не розумію, ось в чому біда:
Наприклад інженер:
може бути взагалі без додаткової колонки - інженер
може бути з колонкою (категорія) - інженер I категорії або інженер II категорії
може бути з колонкою (?) - провідний інженер

Post's attachments

Скриншот Лист1.png 12.74 kb, 176 downloads since 2015-07-06 

4

Re: MySQL БД працівники

fed_lviv написав:
Blast написав:

Намалюйте декілька колонок категорії властивості і так далі. а тоді до кожної додлайте первинний ключ спробуйте з’єднати . в мене так завжди виходить

Трошки не розумію, ось в чому біда:

Так набагато простіше
Таблиці
Професія ід


Розряд ід

Категорія ід

ПІБ ід

Професії:
1.Муляр
2.Електрик
3.Шаро**б

Категорії:
1.Майстер
2.Ламайстер

Берем Петренко Петро петрович ід -1  Професія ПІБ(ід) - 1 Професія(ід) - 1 Категорія(ід) - 2

Берем Петренко Роман петрович ід -2 Професія ПІБ(ід) - 2 Муляр(ід) - 1 Категорія(ід) - 1

І так далі думаю так зрозуміліше

Junior Django Developer

5 Востаннє редагувалося Анатолій (06.07.2015 20:25:15)

Re: MySQL БД працівники

Напевно все прийдеться робити додаткову таблицю,
це буде відповідати поняттю нормалізація баз даних,
а для таблиць міг би бути варіант 

і так в деяких графах будуть пусті поля

http://bestwebit.biz.ua/Forum_Replace_02/project_table.jpg

Збираю знання і... роздаю знання :)

6

Re: MySQL БД працівники

Ви краще зробіть таблицю "працівники" історичною.

Мені доводилось вирішувати проблему обліку при переходах майже двохсот працівників колцентра, а тому я знаю: сьогодні працівник в одному статусі, завтра - в іншому. Тобто краще додати до вашої таблиці ще й дату, з якої вступає в силу нова зміна у полях працівника, а також поле, яке показує чи працівника звільнено, чи ні.

Початково, заповнюєте таблицю із самого старішого періоду, коли про кожного працівника відомо дату переходу і куди саме він переходив. З часом, коли хоч одне значення в переліку полів змінюється, ви додаєте новий запис із датою зміни.

Конкретний приклад.

Якщо у вас є Петренко Петро Петрович, якого зараховано в штат працівників у 2000 році інженером ІІІ розряду, потім у 2003 році його переведено на посаду інженера ІІ розряду, а у 2009 році він звільнився, то у вашій таблці відповідно буде три записи (в останньому записі нічого не зміниться відносно попереднього запису, окрім маркера що працівник звільнився).

І якщо у вас спитають ким Петренко Петро Петрович працював у 2002 та у 2011 році, то ви робите відповідний SQL запит, який вибирає всіх незвільнених працівників станом на 2002 та 2011 роки...

Думаю підказка зрозуміла.

7 Востаннє редагувалося fed_lviv (07.07.2015 09:08:05)

Re: MySQL БД працівники

Наразі прийняв рішення робити дві таблиці (ПРАЦІВНИКИ, ПРОФЕСІЯ):

Так, як кожна професія, або не має додаткової "властивості" або має, але тільки одну + додаткова "властивість" може бути "передньою" (старший майстер, провідний інженер) або "задньою" (інженер I категорії, слюсар VI розряду). Тому прийняв рішення робити тільки два додаткових поля в таблиці ПРОФЕСІЯ (додаткова властивість 1, додаткова властивість 2). Та й при вибірці з БД буде легко формувати повну назву професії:

SELECT CONCAT_WS(" ", додаткова властивість 1, назва посади, додаткова властивість2)...

Всім дякую за поради, якщо хтось бачить кращий варіант з радістю прийму до уваги.
P.S. Нарахунок "історичної" таблиці дякую за пораду, але наразі дане питання відслідковування змін посад не стоїть, тому не має сенсу її робити.

Post's attachments

1.jpg 61.28 kb, 180 downloads since 2015-07-07 

8 Востаннє редагувалося fed_lviv (09.07.2015 11:31:09)

Re: MySQL БД працівники

Маленькі зміни зробив, але в основному все залишилось, як і писав раніше, ось приклад запиту:

SELECT
    staff.boardNumber AS 'табельний',
    staff.idNumber AS 'ідентифікаційний',
    CONCAT_WS(" ", staff.lastName, staff.firstName, staff.middleName) AS 'працівник',
    CONCAT_WS(" ", profession.preSpecialty, profession.specialty) AS 'посада',
    profession.postSpecialty AS 'категорія',
    staff.notesProfession AS 'примітки',
    staff.electricGroup AS 'група з електробезпеки',
    DATE_FORMAT(staff.birthday, '%d.%m.%Y')AS 'дата народження',
    TIMESTAMPDIFF(YEAR, staff.birthday, CURDATE()) AS 'вік',
    DATE_FORMAT(staff.beginningDate, '%d.%m.%Y') AS 'дата прийому',
    TIMESTAMPDIFF(YEAR, staff.beginningDate, CURDATE()) AS 'стаж',
    staff.phone AS 'телефон'
FROM
    staff LEFT JOIN profession USING (idProfession)
ORDER BY
    staff.lastName COLLATE utf8_unicode_ci,
    staff.firstName COLLATE utf8_unicode_ci,
    staff.middleName COLLATE utf8_unicode_ci;

Ось, структура БД:

Post's attachments

1.jpg 82.91 kb, 220 downloads since 2015-07-09 

9

Re: MySQL БД працівники

Між іншим питання до стилю створення назв колонок таблиць,
здається варто писати однаково, напевно стилем CamelCase
а так дещо "кривувато"

profession.postSpecialty AS 'категорія',
staff.notesProfession AS 'примітки',
staff.electricGroup AS 'група з електробезпеки',

TIMESTAMPDIFF(YEAR, staff.birthday, CURDATE()) AS 'вік',
DATE_FORMAT(staff.beginningDate, '%d.%m.%Y') AS 'дата прийому',
TIMESTAMPDIFF(YEAR, staff.beginningDate, CURDATE()) AS 'стаж',



можливо хто знає вимоги

Збираю знання і... роздаю знання :)

10

Re: MySQL БД працівники

Анатолій написав:

Між іншим питання до стилю створення назв колонок таблиць,
здається варто писати однаково, напевно стилем CamelCase
а так дещо "кривувато"

profession.postSpecialty AS 'категорія',
staff.notesProfession AS 'примітки',
staff.electricGroup AS 'група з електробезпеки',

TIMESTAMPDIFF(YEAR, staff.birthday, CURDATE()) AS 'вік',
DATE_FORMAT(staff.beginningDate, '%d.%m.%Y') AS 'дата прийому',
TIMESTAMPDIFF(YEAR, staff.beginningDate, CURDATE()) AS 'стаж',



можливо хто знає вимоги

Не зрозумів, а в мене, що не  CamelCase : postSpecialty, notesProfession, beginningDate,...?

11

Re: MySQL БД працівники

Напевно для Анатолія ще не звично використовувати псевдоніми таблиць, а тому в записі

profession.postSpecialty AS 'категорія'

слово profession сприймає за частину назви поля.

12

Re: MySQL БД працівники

ktretyak написав:

Напевно для Анатолія ще не звично використовувати псевдоніми таблиць, а тому в записі

profession.postSpecialty AS 'категорія'

слово profession сприймає за частину назви поля.

та ні за аліаси я читав та знаю, питання в іншому Можливо я незрозуміло висловив думку,
десь вказані правила написання назв
чому  profession - назва таблиці все з маленької, чи навіть CamelCase
назва функції все з великої,
- десь вказані правила чи рекомендації, наприклад, спільноти w3c???

наприклад з ресурсу http://www.w3schools.com/sql/sql_syntax.asp різниці нема яким чином писати назви, вони прийняли синтаксис просто так чи не просто так, а тому що...

Keep in Mind That...
SQL is NOT case sensitive: select is the same as SELECT
In this tutorial we will write all SQL keywords in upper-case.

Збираю знання і... роздаю знання :)

13 Востаннє редагувалося fed_lviv (14.07.2015 16:09:23)

Re: MySQL БД працівники

Хто підкаже, як краще відображати стаж працівника. Відображаю в роках, але якщо працівник працює менше року показує 0. Хочеться, щоб краще пустота була (null). Тому запит виходить, дуже громіздкий, можливо, можна, якось гарніше:

...
IF(TIMESTAMPDIFF(YEAR, staff.beginningDate, CURDATE())>0, TIMESTAMPDIFF(YEAR, staff.beginningDate, CURDATE()), NULL)AS 'стаж',
...

14

Re: MySQL БД працівники

Відображаю в роках, але якщо працівник працює менше року показує 0. Хочеться, щоб краще пустота була (null).

Ой дарма...

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

15

Re: MySQL БД працівники

Чому?

16

Re: MySQL БД працівники

Тому що нуль тягне за собою всі операції, які визначені для чисел, а в null нічого такого немає.
Тому що null - це заглушка для відсутності будь-якого значення, а в даному випадку значення є.
Тому що ніхто не хоче писати зайву перевірку на null, коли працює з вашою базою.
Тому що я не можу придумати ні одного аргументу "за" null.
Тому що, в кінці кінців, це нелогічно.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

17 Востаннє редагувалося fed_lviv (14.07.2015 18:29:14)

Re: MySQL БД працівники

1. Так null, не в таблиці, знаходиться, а видається після запиту.
2. Згідний значення є, але цікавить тільки рік (роки), тому стаж = 0 виглядає не досить гарно. Звичайно, я б краще в місяцях писав, але не я вибираю.
3. Перевірку писати не потрібно, див. пункт 1 + я й сам буду з нею працювати. В принципі працюю, роблюю GUI (Java) і повинна бути таблиця  там де має бути стаж в роках. Не хочу писати Renderer для таблиці, оскільки треба буде шукати інший фільтр для таблиці....

18 Востаннє редагувалося ktretyak (15.07.2015 15:15:20)

Re: MySQL БД працівники

Цікаво скільки ще пройде часу, щоб ви зважали на поради більш досвідчених людей, в цьому плані?

Показуватиме стаж працівника з його поточною назвою посади? А якщо він працює всього п'ять років і чотири з них працював вантажником, а потім його підвищили до начальника вантажників? Вас влаштує результат "5 років - начальник вантажників"?

19

Re: MySQL БД працівники

ktretyak написав:

Цікаво скільки ще пройде часу, щоб ви зважали на поради більш досвідчених людей, в цьому плані?

Якби мені поради людей були "до одного місця", то я б на форумі напевно не запитував. Тому любій пораді я радий і вдячний. Але, якщо мені, щось радять, але я з цим не згідний, то:
1. Можливо, людина не правильно зрозуміла, що мені в результаті потрібно, або я погано пояснив.
2. Можливо, така порада, ще не осяжна для мого "великого мозку". Тому я зроблю по своєму, з часом зрозумію, що був дурнем і повернусь до даної поради. Оскільки не люблю з закритими очима кудись рухатися. Якщо мені порадили, а я не розумію поради, то.....

ktretyak написав:

Показуватиме стаж працівника з його поточною назвою посади? А якщо він працює всього п'ять років і чотири з них працював вантажником, а потім його підвищили до начальника вантажників? Вас влаштує результат "5 років - начальник вантажників"?

Нарахунок цього, я писав вище, мене багато, що з ПОВНОГО ЗАПИТУ не влаштовує, але мені сказали, зробити таку таблицю і тому моя справа зробити.
Пану quezу я відписав чому саме, я наполягаю на значенні null. Тому я не бачу в цьому ніякої впертості і не бажання прислухатися до порад.

20 Востаннє редагувалося quez (15.07.2015 19:00:24)

Re: MySQL БД працівники

ktretyak написав:

Вас влаштує результат "5 років - начальник вантажників"?

Якщо не робити неправильних з логічної точки зору висновків, то чому ні? "5 років [працює в компанії] - [зараз] начальник вантажників". Але з іншої сторони в періодах займання певної посади є більше сенсу, ніж у періоді роботи в фірмі, це є.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ