Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > какие таблицы создать


Автор: JVM 1.2.2007, 17:35
С БД знаком очень поверхностно, поэтому такой вопрос. Посоветуйте, какие таблицы создать в БД(использую MS SQL 2005), если есть следующее:

full-name    - фамилия и имя пользователя в системе
e-mail         - электронный адрес пользователя, может быть несколько
type-rights - тип прав пользователя, под которыми он заходит в систему
host-name - имя компьютера пользователя
ip-host       - IP-адрес компьютера пользователя
password   - пароль пользователя


Автор: Rodman 1.2.2007, 17:48
-------------
TableUser
********
ID  (INCREMENT)                        
FIO  (VARCHAR)                       - можно на три поля разделить
EMail  (VARCHAR)
CodeTypeRight  (INT)
HostName  (VARCHAR)
IpHost  (VARCHAR)
Password (VARCHAR)
------------

-------------
TableTypeRight
********
ID  (INCREMENT)
Typ0eName  (VARCHAR)
-------------

Автор: JVM 1.2.2007, 18:01
а если у поьзователя несколько e-mail, то они записываются в TableUser
 под разными ID?

Автор: chief39 1.2.2007, 18:10
Цитата(JVM @  1.2.2007,  18:01 Найти цитируемый пост)
а если у поьзователя несколько e-mail, то они записываются в TableUser
 под разными ID? 

А вот тут вопрос требований, а не структуры
Если нужен ОДИН мэйл, неизменный, допустим для человека - тогда просто себе поле

Если их много - тогда дополнительная табличка - <мэйл>,<ID человека>

Автор: JVM 2.2.2007, 09:08
Возникли еще вопросы. Как хранить IP-адрес? Могут ли мне понадобиться отдельные части IP?
Использую Java. Стоит ли смотреть в сторону hibernate?

Автор: Rodman 2.2.2007, 09:31
JVM, если у юзера могут быть несколько почтовых ящиков - то

-------------
TableUser
********
ID  (INCREMENT)                        
FIO  (VARCHAR)                       - можно на три поля разделить
CodeEMail  (VARCHAR)
CodeTypeRight  (INT)
HostName  (VARCHAR)
IpHost  (VARCHAR)
Password (VARCHAR)
------------

-------------
TableTypeRight
********
ID  (INCREMENT)
TypeName  (VARCHAR)
------------- 


-------------
TableEmail
********
ID   (INCREMENT)
IDUser   (INT)
EmailName  (VARCHAR)
------------- 

а про IP - лучше хранить его целиком...

Автор: JVM 2.2.2007, 10:14
Rodman, но если так делать, то в TableUser получается избыточность.
Зачем в TableEmail создавать поле ID? Ведь сам по себе EmailName уже уникален.

Автор: Rodman 2.2.2007, 10:28
Цитата(JVM @  2.2.2007,  09:14 Найти цитируемый пост)
Зачем в TableEmail создавать поле ID?

Я всегда при создании новой таблицы создаю ей ID - потому что при возможном (дальнейшем) расширении базы, может понадобится использования ID этой таблицы... (согласен, если тебе не надо, мож не добавлять это поле)...

Решай сам... мож мой метод глупый, но ИМХО я так делаю, т.к. мои базы состоят как минимум из 20 таблиц...

Автор: LSD 2.2.2007, 11:49
Цитата(JVM @  2.2.2007,  09:08 Найти цитируемый пост)
Могут ли мне понадобиться отдельные части IP?

Это мы должны знать? smile 


Цитата(JVM @  2.2.2007,  10:14 Найти цитируемый пост)
Зачем в TableEmail создавать поле ID? Ведь сам по себе EmailName уже уникален.

Поищи по форуму, тема "естественные ключи vs синтетические" уже обсуждалась.

Автор: SergeBS 2.2.2007, 14:21
Rodman, 
Цитата
FIO  (VARCHAR)                       - можно на три поля разделить

Не можно, а НУЖНО.

JVM, 
На DelphiKingdom - статья Т.Тенцера "Естественные ключи против искусственных". Читай.
Я давно сделал практический вывод для себя: в любой таблице - столбик типа autoinc иметь в обязательном порядке, даже если в ней никогда не будет больше 10 записей. Поскольку обычно "никогда" не бывает. Год-два - и вдруг нате.

Автор: Rodman 2.2.2007, 14:26
SergeBS, не я же базу делаю, я просто советую...

Я с тобой полностью согласен - писал выше 

Автор: JVM 2.2.2007, 15:46
Спасибо. Перевариваю.
Вот статья http://vingrad.ru/DELPHI-DLP-002700

Автор: skyboy 2.2.2007, 16:31
Цитата(JVM @  2.2.2007,  09:14 Найти цитируемый пост)
Зачем в TableEmail создавать поле ID? Ведь сам по себе EmailName уже уникален. 

дело  здесь, в первую очередь, не столько в "естественности", сколько в длине: при работе с самим адресом имеешь ключ переменной длины(что само по себе сильно влияет на скорость работы) и длиной - не менее 6 байт(ну, вроде "a@m.ru"), в то время, как unsigned long int, если память мне не изменяет, фиксировано 8 байт. И не больше. 

Автор: JVM 7.2.2007, 18:10
Rodman, елси у пользователя будет несколько email, то зачем TableUser создавать столбец CodeEMail  (VARCHAR)?

TableUser
********
...
CodeEMail  (VARCHAR)
...

Автор: Rodman 13.2.2007, 16:18
создай отдельную таблицу для Email

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)