|
|
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Добрый день! Я создаю небольшую программку, которая будет использоваться в частных школах. При разговоре с заказчиками решили, что будет четыре типа пользователей: Администратор, Методист, Учитель, Ученик. Соответственно, Администратор может все. Методист может работать только с учебным планом и общей успеваемостью. Учитель может создавать занятия и сохранять результаты проведения занятий в общую ведомость успеваемости. Я решил пойти в лоб, так сказать, и сделал 5 таблиц: users (хранит идентификатор пользователя и ФИО), administrators(ссылается на users по первичному ключу user_id, который является и внешним, хранит дополнительную информацию какую-то об администраторах), methodists (аналогично связывается с таблицей users и хранит какие-то свои поля), teachers(та же история с users и снова свои поля) и, наконец, students(такая же связь с users и свои поля). Теперь проблема сохранения данных о пользователях решена. Нужно теперь решить проблему с контролем доступа. Не могу никак применить сюда RBAC на эту модель. Наведите на мысль, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2013, 19:47 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
В подобных случаях я создаю класс, например SecurityContext, где содержится вся инфа о данном пользователе, не только его роль, но и сделанные юзером настройки, думаю, реализация такого класса не составит для вас труда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2013, 22:23 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksНаведите на мысль, пожалуйста. 1) Взять готовое решение отсюда http://obr.1c.ru/catalog.jsp?top=-1&type=2&aux=-1 2) Или попробовать готовое решение из п.1) тупо попытаться скопировать в свое "поделие", потерять год, так ничего и не сделать, в конечном счете вернуться на п.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2013, 22:42 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Одна таблица users, одно из полей которой ссылается на таблицу user_type, в которой записи: Администратор, Методист и т.д. и поля обозначающие наличие того или иного гранта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2013, 22:59 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
1C? Какой ужас, эта компания еще не написали и строки кода, за которую ее уважать стоит. Вот действительно поделие-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2013, 23:00 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Проясним ситуац, я не разрабатываю столь крупную систему. Вы перегибаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 06:01 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
После входа пользователя сохраняй его права в глобальную переменную. В дальнейшем проверяй в ней есть ли право на конкретную операцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 06:49 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksЯ решил пойти в лоб, так сказать, и сделал 5 таблиц: users (хранит идентификатор пользователя и ФИО), administrators(ссылается на users по первичному ключу user_id, который является и внешним, хранит дополнительную информацию какую-то об администраторах), methodists (аналогично связывается с таблицей users и хранит какие-то свои поля), teachers(та же история с users и снова свои поля) и, наконец, students(такая же связь с users и свои поля). Теперь проблема сохранения данных о пользователях решена. Проблема не решена. Проблема создана. А ваших заказчиков уже жалко Пока не поздно, прислушайтесь к совету: users и user_typeОдна таблица users, одно из полей которой ссылается на таблицу user_type, в которой записи: Администратор, Методист и т.д. и поля обозначающие наличие того или иного гранта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 11:11 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimber, как быть с тем, что скажем у пользователя студента нет логина, а у администртора на есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 11:49 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dima TПосле входа пользователя сохраняй его права в глобальную переменную. В дальнейшем проверяй в ней есть ли право на конкретную операцию.Неправильный подход ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 15:04 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaks, ты плохо разобрался с абстрактными сущностями приложения, пользователи, администраторы, методисты и пр., это все одна сущность - юзеры, их роли - другая, и третья - UserRoles - там ты будешь хранить роли пользователей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 15:09 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skole, Я себе понимаю это так: Есть users (любой тип юзеров имеет запись здесь) | - > administrators (содержит поля, специфичные для администраторов) | - > teachers (содержит поля, специфичные для учителей) | - > students (содержит поля, специфичные для студентов) Есть таблица roles (хранит определение ролей) | - > ADMINISTRATOR_ROLE (роль администратора) | - > TEACHER_ROLE (роль учителя) | - > STUDENT_ROLE (роль ученика) Есть таблица users_to_roles (хранит связь пользователей с ролями) (id, user_id, role_id) Я что-то не так понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 19:37 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksЯ что-то не так понимаю? http://ru.wikipedia.org/wiki/Вторая_нормальная_форма ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 20:30 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
С одной стороны все так. Схема которую ты предлагаешь - будет работать. Но она перегружена. В твоем случае хватит и пяти таблиц: Список пользователей с общей информацией (типа полного имени, пароля, и тп) и четыре ролевых таблицы: список администраторов, методистов, учителей и учеников. При этом отдельной таблицы с ролями и таблицы соответствий пользователь-роль не нужны. Обычно хватает трех таблиц: - список пользователей - список возможных ролей - список соответствий пользователь-роль Плюс этой схемы по сравнению с много-табличной - можно легко создавать новые роли (просто добавить строку в список ролей и все). А в случае роль-таблица - надо будет создавать новую таблицу. Но собственно функциональных отличий между традиционной схемой и твоей нет. Если тебя не смущает что в будущем для ролей "директор" или "завуч" придется создавать новые таблицы, а для удаления ненужных ролей удалять таблицы.... то вперед. Ни у традиционалисты будут тебя материть за изобретение велосипеда. Решение с одной таблицей - список пользователей с флагами принадлежности к ролям (как предлагал некто безымянный 14284940 ) тоже может существовать. Оно чуть проще, но по существу не отличается от твоего. В этой схеме список ролей жестко задан изначально и если понадобиться добавить новую роль или убрать старую - надо будет менять таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 20:50 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Usman, ну а где я ее нарушаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 20:52 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksскажем у пользователя студента нет логина, а у администртора на есть?Если пишется БД - то у любого пользователя есть логин. Хотя бы - Guest. И нужно просто понимать, что "пустой" логин (даже если вы додумаетесь использовать такое) - это тоже информация... Далее, по предыдущему посту: Если вы действительно желаете иметь всяких там методистов и преподавателей, а права привязывать именно к типу пользователя, то строим примерно так: Есть таблица Users (здесь прописаны все пользователи), в ней поля id name ..другие поля Есть таблица Types (здесь прописаны возможные типы пользователей (Методист и т.п.), они же в вашем понимании - "роли"), в ней поля id name ..другие поля Есть таблица UsersTypes (здесь прописаны роли конкретных пользователей - зачем? затем, что один пользователь может иметь и несколько ролей), в ней поля idUser (<->Users.Id) idType (<->Types.Id) Есть таблица Rights (здесь прописаны права на действия в программе), id name ..другие поля Есть таблица RightsTypes (здесь прописаны соответствия между типами (ролями) и правами пользователей), в ней поля idUserType (<-> UserTypes.Id) idRight (<-> Rights.Id) Когда вы создаете/модифицируете пользователя - вы прописываете его самого в Users, а его возможные "роли" - в UsersTypes. Когда вы создаете/модифицируете "роль" - вы прописываете её тип в Types, а "права" - в RightsTypes. А таблица Rights - это внутренняя таблица самой базы, она создается и модифицируется разработчиком (который и продумывает межанизм реализации прав доступа). А слова "Администратор", "Методист" и т.д. - это просто текстовые строки в поле UserTypes.Name... Где-то так, для начала... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 21:08 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли тебя не смущает что в будущем для ролей "директор" или "завуч" придется создавать новые таблицы, а для удаления ненужных ролей удалять таблицы.... то вперед. Ни у традиционалисты будут тебя материть за изобретение велосипеда.Пока набирал - пропустил пост И да будем материть - ибо в этом случае Оккам своим серпом по одному месту... ну вы поняли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 21:18 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksrockclimber, как быть с тем, что скажем у пользователя студента нет логина, а у администртора на есть?А в чем проблема? Проблема будет, когда заказчик полгода спустя скажет - а давайте сделаем логины студентам, пусть расписание сами узнают! И вы еще раз сделаете то, что уже делали по отдельности для администраторов, методистов и учителей. Вместо того, чтобы сделать один раз для всех и забыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 21:51 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
AndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:03 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksну а где я ее нарушаю? Нарушений нет. Есть небольшая избыточность. Можно сократить до двух таблиц: Модератор: Вложение удалено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:14 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Обновил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:17 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberscymaksrockclimber, как быть с тем, что скажем у пользователя студента нет логина, а у администртора на есть?А в чем проблема? Проблема будет, когда заказчик полгода спустя скажет - а давайте сделаем логины студентам, пусть расписание сами узнают! И вы еще раз сделаете то, что уже делали по отдельности для администраторов, методистов и учителей. Вместо того, чтобы сделать один раз для всех и забыть.Вы оба путаете наличие логинов с обязательностью паролей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:24 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skoleAndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать.Вот за это "на уровне приложения" - убивать на месте. У Васи версия клиента номер 1, он может будучи учеником может править урок. Ну баг там был в приложении. Ты обнаружил баг, исправил его и выпустил версию приложения номер 2. Счастье? А фиг! Вася зная о баге не стал обновлять свое приложение и спокойно правит уроки. А директор школы сказал: "а почему это методист не может создавать уроки? Дайте ему доступ" и начнешь ты опять править приложение а потом распространять его... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:34 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
UsmanОбновилВроде-бы, кто-то, не так давно, намекал что TC нарушает принципы нормализации. Не помнишь кто это был? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:36 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksЯ создаю небольшую программку, которая будет использоваться в частных школах.Кстати, уточни пожалуйста, какой СУБД ты пользуешься и пользуешься ли вообще какой-нибудь? Просто у большинства много-пользовательских СУБД уже есть готовые (системные) таблицы пользователей и системы ролей и/или групп. И твоя начальная задача решается не создаваемым таблицами а простым использованием имеющихся средств. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:43 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skoleAndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать."Логика на клиенте" vs "логика в БД" - это уже совсем другой холивар ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:49 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White OwlskoleAndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать.Вот за это "на уровне приложения" - убивать на месте. У Васи версия клиента номер 1, он может будучи учеником может править урок. Ну баг там был в приложении. Ты обнаружил баг, исправил его и выпустил версию приложения номер 2. Счастье? А фиг! Вася зная о баге не стал обновлять свое приложение и спокойно правит уроки. А директор школы сказал: "а почему это методист не может создавать уроки? Дайте ему доступ" и начнешь ты опять править приложение а потом распространять его...Вообще то это best practice ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:55 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberskoleAndreTM, ++ Только правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать."Логика на клиенте" vs "логика в БД" - это уже совсем другой холивар Это не логика, это интерфейс, который ты проводишь сквозь все приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 22:57 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White OwlВот за это "на уровне приложения" - убивать на месте.Я, наверное, выразился как видел. Skole - как видел он. А говорим мы о разном. Я хотел сказать, что привязки "роль-права" доступны в приложении. И "ученик<+/->модификация урока" - это связка в RightsTypes . На уровне приложения. А вот запись в Rights "модификация урока" <=> "GRANT/REVOKE INSERT,UPDATE,DELETE ON TABLE lessons TO ..." и будет на совести разработчика... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2013, 23:02 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
AndreTMWhite OwlВот за это "на уровне приложения" - убивать на месте.Я, наверное, выразился как видел. Skole - как видел он. А говорим мы о разном.О разном? Ну вот я говорю о том что: Вариант 1) Права пользователя жестко завязаны на его роль. Тогда таблица Rights не нужна вообще и приложение узнав к какой роли пользователь принадлежит включает/выключает доступ до определенного модуля. Вариант 2) Роль это глобальное понятие, например Учитель. Но учитель биологии не может править уроки по физике и наоборот, тогда нужно вводить "вторичная роль" и доступ до модуля "учитель" для МарьВанны выдается по ее роли, а потом гранулируется второй раз при помощи таблицы rights и выдается доступ до классов соответствующего типа. В обоих вариантах доступ разграничивается на сервере. А skole предлагает: skoleТолько правила доступа здесь не нужны, это делается на уровне приложения, то есть по умолчанию доступа нет ни у кого, но на уровне приложения открываешь доступ для админа - удалять, для методиста редактировать. То есть по его мнению, если читать дословно, то получается что пользователь приходит в базу данных и не может ничего сделать на уровне СУБД. Потом в приложении отрабатывает некая волшебная функция которая разрешает этому конкретному пользователю что-то делать. В итоге получаем нечто теоретически невозможное. Предположим что skole описался и он имел в виду что пользователь может делать все что угодно на уровне СУБД, но приложение прочитав роль пользователя и узнав что это роль с ограниченными правами выключает доступ до определенных модулей. (Это уже вполне реальная ситуация и я ее видел в живую неоднократно.) Но тогда, смотри мой предыдущий ответ для skola. Это абсолютно незащищенное от злоумышленников решение, и оно чрезвычайно шатко когда дело касается целостности данных. В случае если СУБД без-юзерного типа (FoxPro, SQLite, etc), то это единственно возможное решение и тогда действительно будет нужна таблица users и ручное придумывание системы разграничения прав доступа. Опасно и ненадежно, но увы без вариантов. Но если СУБД имеет встроенную систему распознавания пользователя (MS SQL, Oracle, MySQL, etc) то надо ею воспользоваться и пользователь пришедший в СУБД будет иметь частичные права (по его роли) не смотря на клиента. В этом случае делать права доступа на уровне приложения - лишняя работа. А если на такой СУБД давать права изначально на все, а потом делать правила доступа на уровне клиента, то это повод оторвать разработчику руки по самые гланды. AndreTMЯ хотел сказать, что привязки "роль-права" доступны в приложении. И "ученик<+/->модификация урока" - это связка в RightsTypes . На уровне приложения. А вот запись в Rights "модификация урока" <=> "GRANT/REVOKE INSERT,UPDATE,DELETE ON TABLE lessons TO ..." и будет на совести разработчика...А при чем здесь разработчик? Это работа для Администратора а не разработчика. В модуле Администратора будет кнопка "дать/отнять роль учителя" и по ее нажатии будет запускаться эта команда. И все собственно. Вот если TC будет делать разграничение по типу уроков (биология-физика-рисование), то тогда надо будет делать еще и запись в Rights с указанием какие именно строки из lessons можно править этому пользователю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 00:27 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White Owl, ну, я примерно это и имел в виду... А то ТС что-то изначально не упомянул о наличии в его СУБД встроенных средств контроля доступа... И про Оккама я тоже вроде уже... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 00:42 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Внесем ясность, пользователь приложения не есть пользователь БД. Далее, как реализуется такой функционал? Я уже вначале упомянул, что для этого создается класс, например UserContext, который реализует интерфейс IUserContext. На входе пользователя мы загружаем этот класс данными из БД, настроек приложения, конфигурационных файлов, словом состав класса и структура интерфейса дело воображения. Предположим наш пользователь производит какие-то действия, открывает форму например, тогда мы передаем в форму его UserContext, немного псевдокода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Это разумеется примитивное использование такого функционала разграничения доступа пользователей по ролям, но механизм четко выражен. Надеюсь, моя мысль понятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 01:24 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skoleВнесем ясность, пользователь приложения не есть пользователь БД.Все, дальше можно не читать. Пользователь приложения не будет пользователем БД только в одном единственном случае - абсолютном отсутствии БД. В общем: "В школу!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 02:26 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Ты что, на каждого пользователя создаешь учетку в БД? Забавно конечно, но в этом смысла нет, для приложения достаточно одной учетки, чтобы инкапсулировать всех пользователей приложения, иначе, зачем весь этот функционал. Кроме того, пользователи приложения ничего не знают об учетке (и правах) приложения в БД, им это и не нужно, любое приложение на соответствующем уровне представляет абстракцию для работы в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 03:50 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
skoleТы что, на каждого пользователя создаешь учетку в БД? Забавно конечно, но в этом смысла нет, для приложения достаточно одной учетки, чтобы инкапсулировать всех пользователей приложения, иначе, зачем весь этот функционал.Действительно, зачем брать готовый функционал для аутентификации и хранения паролей, который есть в любой БД? Мы нарисуем свой, с блекждеком и шлюхами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 08:18 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberкоторый есть в любой БД?СУБД конечно, но сути это не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 08:19 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimber, Сейчас занят, вечером отпишусь подробно о всем что здесь прочитал. Я использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 09:45 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberДействительно, зачем брать готовый функционал для аутентификации и хранения паролей, который есть в любой БД? Мы нарисуем свой, с блекждеком и шлюхами! Для поделок на коленке или маленьких декстопных систем без развития (в чем сомневаюсь) - управление учетками и правами доступа на уровне БД - будет достаточно. Как только * система начинает расти, в ней появляются бизнес-функции (это помимо сущностей - ака таблицы БД), на которые так же есть права доступа * или систему необходимо выложить в инет (т.е. засветить логины/пароли к базе в инете) начинаются проблемы и костыли и большие фундаментальные переделки насчет бизнес-функции - да можно в хранимки запихнуть бизнес-логику и опять через базу рулить правами, что не всегда есть хорошо - на ООП ЯП можно эффективней сделать то, чего нельзя сделать на SQL и наоборот и плюс логика может размазаться в двух местах с дублированием кода в представленном ТС случае, я бы сделал так: 1. таблица пользователей, у пользователя одна роль 2. таблица ролей (Администратор, Методист, Учитель, Ученик) 3. таблица роль-право_доступа (RoleId int, PermissionId int) причем PermissionId - это код права доступа, его сделать перечнем (enum) в используемом ООП ЯП 4. так как ученикам не нужен логин/пароль - тупо их не заводить в системе, они будут иметь доступ только в публичную часть 5. когда пользователь авторизуется - необходимо хранить текущего пользователя и его роли/права в неком едином месте (зависит от используемой платформы и ЯП) 6. когда пользователь заходит в некую бизнес-функцию - написать метод, который будет проверять право доступа на эту функцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 09:46 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaksЯ использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле). вот, еще одна причина, по которой не следует писать бизнес-логику в хранимках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 09:53 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
17-77, я уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный. Если вы не умеете делать это на SQL (PL/SQL. TSQL ...), но умеете на java - делайте на java, вам никто не запрещает. Но только не надо говорить, что только ваш путь правильный, а остальные ведут в тупик. Управление правами - слишком простая вещь, чтобы у нее были принципиальные ограничения на способ реализации. Если же вы сталкивались с тем, что на уровне БД не получается реализовать какую-то хитровывернутую систему управления правами - пример в студию, посмеемся посмотрим. scymaksrockclimber, Сейчас занят, вечером отпишусь подробно о всем что здесь прочитал. Я использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).Вам под вашу задачу идеально подходит Oracle APEX (попробовать и потренироваться на кошках можно тут - жмакайте на кнопочку "Request free workspace"). По сути, тот же аксесс, только на Оракле, бесплатно (!!!), с веб-интерфейсом и с кучей готовых шаблонов "как реализовать разграничения прав доступа" (как на уровне БД, так и на уровне приложения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 10:05 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimber, ага, холивар ограничения я написал уже, про эффективность решения задач на том или ином ЯП система прав доступа работает совместно с остальными частями системы rockclimberЕсли же вы сталкивались с тем, что на уровне БД не получается реализовать какую-то хитровывернутую систему управления правами - пример в студию, посмеемся посмотрим. я не использую подход разграничения прав доступа на уровне БД, а насчет примера - я уже говорил, что права есть к сущностям (таблицам БД) и к бизнес-функциям, которых в БД может и не быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 10:23 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
scymaks, так и делать на RBAC к чему хренатень-то с 4-мя таблицами? роли реализует стандартный софт СУБД всех юзеров в одно и потом им раздавать роли (кто-то может быть в двух и более ролях), менять роли ИС делать надо (основу хотя бы), а роли потом уж PS Либо надо сразу полноценный проект в какой-нибудь системе спецификаций и управления требованиями, где и роли будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 10:44 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberя уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный.Неправда. Это не холивор, а нашествие молодежи работавшей на одном-двух микро-проектах и не имеющих реального опыта. Не сталкивались они с кретинами юзерами узнавшими логин-пароль под которым ходит в базу приложение и попытавшимися "подправить" базу напрямую. Не видели как стажер делает дамп базы и продает ее конкурентам, а большие боссы почему-то очень сердятся. Не встречались наши носители розовых очков с нуждой иметь два-три разных клиента к базе данных... Вынос бизнес-логики на приложение в этом случае превращается в настоящий рай для энтомологов и психиатров. Не было у них в жизни розысков "какая сволочь платежку исправила?!"... Юность это счастье. scymaksЯ использую PostgreSQL, но не хотелось бы использовать каких-то слишком уж нативных средств. Потому как в будущем возможна миграция на Oracle или что-то еще (не по моей воле).Не обязательно использовать нативные средства через нативный синтаксис. Вполне можно ходить к базе через ODBC/ADO и делать всю работу через универсальные интерфейсы. Они спрячут почти все нативность внутрь драйверов и потом можно будет просто перенаправить DNS на другую базу и все. Переделки в этом случае все равно будут, но минимальные. Ну и в конце-концов, если заказчик хочет Оракл (и готов его купить) - можно взять бесплатную GA редакцию и разрабатывать свой проект на ней. Практически все современные СУБД имеют сейчас бесплатные редакции предназначенные для разработки пилотных версий и/или студенческих игрищь. Но я очень советую заранее определиться с СУБД и писать сразу на ней. Даже если ты специально будешь ограничивать себя диалектом SQL-92 - все равно рано или поздно столкнешься с необходимостью сделать кое-что нативно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 18:38 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White Owlrockclimberя уже сказал и повторюсь еще раз: это просто холивар, бессмысленный и беспощадный.Неправда. Это не холивор, а нашествие молодежи работавшей на одном-двух микро-проектах и не имеющих реального опыта. Не сталкивались они с кретинами юзерами узнавшими логин-пароль под которым ходит в базу приложение и попытавшимися "подправить" базу напрямую. Не видели как стажер делает дамп базы и продает ее конкурентам, а большие боссы почему-то очень сердятся. Все должно развиваться эвалюционно. Образный пример: если на запорожец приладить колеса от вездехода, то вездеходом он не станет. Станет чуть-чуть проходимее, но не вездеходом. Это я к тому что один правильный кусок программы не спасет ее от взлома, просто чуть-чуть его усложнит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 21:00 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dima TВсе должно развиваться эвалюционно. Образный пример: если на запорожец приладить колеса от вездехода, то вездеходом он не станет. Станет чуть-чуть проходимее, но не вездеходом. Это я к тому что один правильный кусок программы не спасет ее от взлома, просто чуть-чуть его усложнит.Видишь ли, дизайн систем это не запорожец. Дизайн систем это ответ на вопрос "есть у запорожца мотор и колеса или нету". Сейчас на запорожец можно в принципе поставить колеса от вездехода, но гусеницы или пропеллер к нему не приладить никак. Для таких переделок эволюции мало, для них полный ре-дизайн нужен. А если ты изначально хотел получить вертолет, но сделал запорожец тебе никакая эволюция уже не поможет. Так и здесь. Если изначально пойти по пути наименьшего сопротивления и сделать секьюрити и бизнес-логику на уровне приложения, то потом тебе придется делать полный рефакторинг и клиента и сервера чтобы перенести их на сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2013, 21:52 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Ну да, ну да... Действительно, прослеживается, что ТС начал разработку БД как для файл-сервера. Без понимания, что в клиент-серверной СУБД клиенту всё равно не обломится из базы больше информации, чем предусмотрено правами при коннекте. Видимо, думает, что если guest в клиентском интерфейсе жмакнет "удалить урок" - то СУБД сразу его и послушается Хотя, если сделать коннекты, как предлагали здесь некоторые - то так и будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2013, 01:38 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberscymaksrockclimber, как быть с тем, что скажем у пользователя студента нет логина, а у администртора на есть?А в чем проблема? Проблема будет, когда заказчик полгода спустя скажет - а давайте сделаем логины студентам, пусть расписание сами узнают! И вы еще раз сделаете то, что уже делали по отдельности для администраторов, методистов и учителей. Вместо того, чтобы сделать один раз для всех и забыть. Ну при моем подходе были бы логины у студентов тоже. Если бы требовалось чтобы все пользователи имели бы доступ через логин, то он был бы вынесен в таблицу users ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 11:00 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White Owl, Схема разрабатывается для web приложения. Так что актуальная версия всегда будет у всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 11:01 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Мне вот интересно, а как быть (в случае когда доступом рулит БД), если требуется доступ только к определённым записям в таблице, а не ко всей таблице ? Например, чтобы пользователь 1 мог удалять только свои записи, просматривать записи пользователя 2, но не видел записей пользователя 3 и 4 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 00:47 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevМне вот интересно, а как быть (в случае когда доступом рулит БД), если требуется доступ только к определённым записям в таблице, а не ко всей таблице ? Например, чтобы пользователь 1 мог удалять только свои записи, просматривать записи пользователя 2, но не видел записей пользователя 3 и 4 ?А это зависит от СУБД. У большинства для этого есть специальные модули, которые стоят специальные деньги. Ну и универсальный бесплатный способ: всю работу с базой вести исключительно через хранимые процедуры. В них и делать все что нужно для определения есть у этого юзера доступ к этой записи или нет. Другой вариант: делаешь view (обновляемый если нужно) и в нем уже даешь доступ к определенной записи для юзера по нужным правилам и заставляешь всех юзеров работать с этими представлениями (просто отбираешь доступ к таблице, разрешаешь к представлению). Собственно говоря, "решения из коробки", те самые дополнительные модули для СУБД, именно так и делают. Но они не создают отдельное представление, а подменяют обращение к реальной таблице на обращение к виртуальному представлению. Ты определяешь правила доступа к записи, а сервер уже будет на каждое обращение к записи проверять этот набор правил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 01:05 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Интересный вариант :). Особенно если пользователей не один десяток. Представляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять. А уж вести логирование бизнес дейстивий... видимо тоже с помощью хранимых процедур ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 01:29 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevИнтересный вариант :). Особенно если пользователей не один десяток. Представляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять.Не вижу проблем. Каждая запись имеет "признак принадлежности". Это может быть и имя юзера (если доступ надо делать персонализированным) или код отдела/филиала/группы/итп. А потом просто Код: sql 1. 2. или Код: sql 1. 2. И все. Dmitry EliseevА уж вести логирование бизнес дейстивий... видимо тоже с помощью хранимых процедур ?Ну а это то какие сложности у тебя вызывает? Триггера в школе не проходили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 01:37 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
[quot White Owl]Dmitry Eliseev А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять. Dmitry EliseevА уж вести логирование бизнес дейстивий... видимо тоже с помощью хранимых процедур ?Ну а это то какие сложности у тебя вызывает? Триггера в школе не проходили? Проходили конечно, только хочется чтобы в логе было записано: Код: sql 1. , а не сотню строк типа Код: sql 1. 2. 3. потом такие же действия со связанными таблицами, и наконец: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 02:09 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
[quot Dmitry Eliseev]White Owlпропущено... Проходили конечно, только хочется чтобы в логе было записано: Код: sql 1. , а не сотню строк типа Код: sql 1. 2. 3. потом такие же действия со связанными таблицами, и наконец: Код: sql 1. Ну во первых, лично я за такие текстовые логи увольняю на месте. Подобные текстовые записи в логах удобны только на первый взгляд. Но если тебе понадобиться узнать что происходило с расписанием "Новое". Тебе придется заниматься извращенным сексом с регулярными выражениями и при этом без уверенности в успехе. Когда люди делают текстовые логи, они не склонны придерживаться шаблонов, зато склонны соблюдать грамматику. И в итоге получается: - расписание Новое создала Света - Изменение в расписании <<Новое>> сдал Боря - Иванов Иван Иванович удалил информацию о расписании "Новое" А через год попытайся собрать историю этого расписания и ты скорее свихнешься чем добьешься успеха. А во вторых, запись с полями типа (user_id, type_of_items, action_code, item_id) всегда можно будет расшифровать в текст любого из форматов которые я уже показал, и в тысячи других форматов которые ты можешь придумать. И в третьих, ну и какие сложности ты видишь чтобы создать текст "Иванов Иван Иванович удалил информацию о расписании "Новое" " из триггера или хранимой процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 05:57 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevПредставляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять.1 SQL-запрос и три таблицы. И, между прочим, на первой странице топика все это уже описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 08:34 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Неважно в текстовый лог идёт запись или в лог со специфическим форматом. На основной вопрос так и нет ответа. Как сделать логирование БИЗНЕС процесса, когда этот процесс меняет содержимое нескольких таблиц (от трёх до десяти). Куда вешать триггер? rockclimberDmitry EliseevПредставляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять.1 SQL-запрос и три таблицы. И, между прочим, на первой странице топика все это уже описано. Там описано для случая, когда пользователями/правами/ролями управляют на уровне приложения. Мне интересно как это сделать на уровне СУБД. Кстати, использование хранимых процедур ничем не отличается от написание того же кода в приложении. Т.е. фактически только место исполнения кода разное. В пользу кода в приложении говорит переносимость между СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 10:24 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevНеважно в текстовый лог идёт запись или в лог со специфическим форматом. На основной вопрос так и нет ответа. Как сделать логирование БИЗНЕС процесса, когда этот процесс меняет содержимое нескольких таблиц (от трёх до десяти). Куда вешать триггер?Хотите самостоятельно логировать изменения в каждой отдельной таблице? Тогда на каждую из логируемых таблиц создаете триггер и "парную" ей таблицу для логирования изменений. Разворачивание таблиц-логов для "разбора полетов" - отдельная, достаточно "веселая" задача... Dmitry Eliseevrockclimberпропущено... 1 SQL-запрос и три таблицы. И, между прочим, на первой странице топика все это уже описано. Там описано для случая, когда пользователями/правами/ролями управляют на уровне приложения. Мне интересно как это сделать на уровне СУБД.Принцип тот же самый. Только в одном случае это нужно делать "ручками", а в другом случае - фича базы данных. Например, в Oracle это что-то типа "fine-grained access control" или "virtual private database". В общих чертах там это работает как прозрачное (и невидимое) для пользователя включение дополнительного условия фильтрации (с учетом пользователя и его ограничений) в любую DML-команду. Dmitry EliseevКстати, использование хранимых процедур ничем не отличается от написание того же кода в приложении. Т.е. фактически только место исполнения кода разное. В пользу кода в приложении говорит переносимость между СУБД.Переносимость между разными СУБД актуальна только когда стоимость переноса равна нулю - а такого не бывает даже при переезде между разными "бесплатными" СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 13:01 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevВ пользу кода в приложении говорит переносимость между СУБД.Переносимость между СУБД? Ха-ха-ха. Это все сказки и фантазии людей ни разу не выходивших за рамки студенческих курсовых. В реальности, если ты решишься переходить с одной СУБД на другую, то только по причине гигантской разницы между СУБД. Вот с FoxPro/Clipper на какую-нибудь SQL-based СУБД переходят запросто (при этом полностью все переписывая естественно). Это экономически оправданно. Переход между разными SQL-based DBMS экономически не оправдан почти никогда. Переход с одной базы на другую (с MySQL на Oracle) я в жизни видел всего один раз. У несчестной конторы сменился начальник который очень любил ораклятину и ему было плевать на затраты. Переход шел около двух лет и за это время контора практически полностью потеряла всех своих контрагентов (в том числе и нас) потому что нам тоже пришлось выкидывать весь наработанный софт которым мы общались с ними и писать его заново. А для этого уже нам пришлось бы нанимать ораклистов. Мы подумали, поприкидывали и ушли от той конторы к ее конкурентам. Те обещали более удобное API для своих баз и большие скидки на услуги. Сейчас несчастные вроде-бы снова поднимаются, но почти четыре года они сидели в глубокой экономической яме. Старые клиенты на них плевались, а новые косились. А все потому что Большому Боссу не нравилась "бесплатность" используемой СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 17:28 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Перенос между разными SQL-ными СУБД вполне возможен и по экономическим причинам. Например с Oracle, на PostgresQL, чтобы продать решение без навязывания покупки Оракла, или исходя из удобства/неудобства использования диалекта SQL. Весьма распространена ситуация когда у заказчика используется Oracle, разработчику удобнее использовать Postgres, а тесты гоняются на H2. При этом liquibase обеспечивает единство баз под всеми этими платформами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 23:02 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevПеренос между разными SQL-ными СУБД вполне возможен и по экономическим причинам.Я такое только про "коробки" слышал - про продукцию 1С и Atlassian (Jira, Confluence и пр.) например. Еще ЦФТ пыжится что-то такое родить, но, судя по слухам, есть большой шанс, что надорвется... Во всех остальных случаях без живых цифр на руках или известных примеров лучше даже не заикайтесь про это. Даже просто переход на следующую версию той же СУБД не всегда гладко проходит (опять же, видел краем глаза, как ЦФТшную АБС готовили к переходу с 9-го оракла на 11-й - процесс планировали чуть ли не за год), многие до сих пор сидят на 9-м или 10-м оракле, хотя уже 12 скоро выйдет, а вы сразу на другую СУБД перескочить хотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 08:31 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevПеренос между разными SQL-ными СУБД вполне возможен и по экономическим причинам. Например с Oracle, на PostgresQL, чтобы продать решение без навязывания покупки Оракла, или исходя из удобства/неудобства использования диалекта SQL.Приводить "экономические причины" не серьезно - аргумент "для очень бедных". В действительно серьезных проектах стоимость лицензий никогда не составляет сколь-либо значимую долю расходов. Получается, типа, "мы тут замутили проЭкт на 100500 мульенов денег, но купить лицензионный софт нам капусты не хватает"... И не забываем, что ни один "бесплатный продукт" никогда не был бесплатным в обслуживании - вплоть до того, что обслуживание (иногда) обходится гораздо дороже, чем для "платных"... Ну, а "удобство/неудобство диалекта SQL" - вообще смешно... Dmitry EliseevВесьма распространена ситуация когда у заказчика используется Oracle , разработчику удобнее использовать Postgres , а тесты гоняются на H2 . При этом liquibase обеспечивает единство баз под всеми этими платформами.Вы лучше расскажите (потенциальным заказчикам), ГДЕ практикуется подход разработки с ТАКИМ "зоопарком" - сугубо "во избежание"... Заодно попытайтесь озвучить аргументы, по которым разработку (в частности, под Oracle) нужно (и возможно) использовать совершенно "перпендикулярные" средства... Очень надеюсь, что Вы (хотя бы теоретически) подозреваете, что при "зоопарк-подходе" Вы НИКОГДА не сможете использовать сколь-нибудь значимую часть реальных возможностей целевой платформы заказчика. Для SQL-серверов это (в лучшем случае) будет ограничено "базовыми" SQL-командами (select/insert/update/delete) c крайне упрощенным синтаксисом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 11:33 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
смешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 17:12 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry Eliseevсмешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется...И это - все претензии?! Ну, что тут сказать... Поплачьте... Уж сколько работаю с разными СУБД, но какой-то принципиальной необходимости в типе данных TIME ни разу не испытывал - это при том, что последние несколько лет работаю в разработках для телекома... И мне ОЧЕНЬ хочется посмотреть, как Вы свой проект, который вели на платформе, где есть и автоинкреммент, и TIME перенесете туда, где "в-лоб" такого не наблюдается физически... Особенно - если Вы на них "насмерть" завязаны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 17:41 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry Eliseevсмешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется...Это у кого нет типа TIME??? (СУБД уровня "неуловимый Джо" не рассматриваем). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 20:12 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberDmitry Eliseevсмешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется...Это у кого нет типа TIME??? (СУБД уровня "неуловимый Джо" не рассматриваем).У очень многих на самом деле. Даже Sybase ASE вплоть до 12-ой версии считал что одного datetime хватит и для дат и для времени. Правда в15-ой версии одумались :) MS SQL всю жизнь шел у Sybase ASE на поводу и тоже не имел отдельных типов date и time вплоть до 2005-ой версии. Их сделали только в 2008-ой. Ну а SQLite в принципе не имеет никаких специальных типов для даты-времени. Там обходяться хранением целых и/или текстов и кучкой функций для конвертации этих типов в дату-время. Тем не менее SQLite является самой популярной встраиваемой базой на сегодня (да и самой лучшей пожалуй). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 07:06 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White OwlMS SQL всю жизнь шел у Sybase ASE на поводу и тоже не имел отдельных типов date и time вплоть до 2005-ой версии. Их сделали только в 2008-ой.Жесть какая. Вроде, даже в аксессе есть тип даты, я думал, что уж в MS SQL-то точно должно быть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 09:47 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberWhite OwlMS SQL всю жизнь шел у Sybase ASE на поводу и тоже не имел отдельных типов date и time вплоть до 2005-ой версии. Их сделали только в 2008-ой.Жесть какая. Вроде, даже в аксессе есть тип даты, я думал, что уж в MS SQL-то точно должно быть...Вместо даты там datetime, округлённый до суток :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 10:15 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1341793]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
151ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
125ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 586ms |

| 0 / 0 |
