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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стуктура базы, создать 
:(
    Опции темы
Лена
Дата 2.7.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Помогите создать стуктуру базы данных.
Есть прибор который устанавливается на автомобиль и шлет на сервер сигналы (координаты автомобмиля и т.п.).
Сигнал выглядит так:
1010000002,20030217132813,121.646060,25.061725,20,157,133,7,0,11,15,0.096,0.000
Где первая цифра это номер прибора, вторая дата, далее координаты и др.данные.
Прибор при поставке имеет номер и пароль.

Мне надо к прибору привязать как минимум для начала водителя и автомобиль. Я предпологаю следущие таблицы в базе:
1. Таблица прибора:
ID прибора (пер. ключ)
Код прибора (заводской например, 1010000002) NOT NULL + UNIQUE тип integer
Пароль прибора (тоже заводской, например 0001) NOT NULL + UNIQUE тип строка
Примечание 

2. Таблица автомобиля:
ID автомобиля (пер. ключ)
Марка
Номерной знак
ID прибора (FK внешний ключ)
Фото автомобиля
Примечание
* в таблице автомобили ID прибора это внешний ключ к полю ID прибора таблицы приборы. Характеристики ключа FK при удалении записи из таблицы приборы ON UPDATE SET NULL ON DELETE SET NULL т.е. устанавливаем ID прибора в таблице автомобили в NULL при удалении записи из таблицы номер 1. И вообще нужен ли этот FK?

3. Таблица водителя:
ID водителя (пер. ключ)
Фамилия NOT NULL – надо?
Имя
Отчество
Дата рождения
Телефон 1
Телефон 2
Адрес водителя
Фото водителя
Примечание
* нужно ли какое-то дополнительное поле для связи таблиц в таблице водители?

4. Таблица сигналов идущего от прибора (лог сигналов):
ID пер.ключ, + 13 колонок для строки: 1010000002,20030217132813,121.646060,25.061725,20,157,133,7,0,11,15,0.096,0.000

5. Таблица связей:
ID связи (пер.ключ)
ID прибора NOT NULL
ID автомобиля NOT NULL
ID водителя NOT NULL
* нужны ли FK и эта таблица?

Помогите описать стуктуру. Спасибо. 
PM MAIL   Вверх
LSD
Дата 2.7.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



1. Я бы изменил направление связи автомобиль-прибор. Прибор не может стоять на нескольких автомобилях, только на одном. Потому прибор должен ссылаться на автомобиль на котором он установлен.

2. Как соотносится водитель и автомобиль? К водителю приписана одна машина или несколько? Несколько водителей могут быть приписаны к одной и той же машине?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Akina
Дата 2.7.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Я бы для соответствия автомобиль-прибор ввел бы отдельную таблицу. Приборы выходят из строя и отправляются в ремонт, переставляются с одного автомобиля на второй... то есть на самом деле связь-то много-ко-многим, хотя на любом временнОм срезе она один-один. Так будет и история храниться, и выборки можно делать за любой период времени.
Аналогично и для связи водитель-автомобиль нужна отдельная таблица.


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

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


Опытный
**


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

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



Cпасибо за ответ!
Значит согласно вашей первой рекомендации должно быть так:

1. Таблица прибора:
ID прибора (пер. ключ)
Код прибора (заводской например, 1010000002) NOT NULL + UNIQUE тип integer
Пароль прибора (тоже заводской, например 0001) NOT NULL + UNIQUE тип строка
ID автомобиля /*(внешний ключ) какие у него характеристики ON UPDATE SET NULL ON DELETE SET NULL?*/
Примечание 

Правильно? smile 

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

Добавлено @ 14:45
Akina, можно примерную схему? У меня проблемы с моделированием БД, серого вещества не хватает.  smile 

Это сообщение отредактировал(а) Лена - 2.7.2008, 14:45
PM MAIL   Вверх
Deniz
Дата 2.7.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Лена, СУБД не указана, поэтому общий пример:
1. Таблица прибора:
ID прибора (пер. ключ)
Код прибора
и т.д.

2. Таблица автомобиля:
ID автомобиля (пер. ключ)
Марка
Номерной знак
и т.д.

2. Таблица прибор-автомобиль:
ID (пер. ключ) автоинкремент
ID прибора FK
ID автомобиля FK
Дата установки прибора not null default current_datetime
Дата снятия прибора
дополнительные поля при необходимости (кто ставил, где ставили и т.д.)

Аналогично связка водитель-автомобиль.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Лена
Дата 2.7.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Deniz, большое спасибо, сейчас буду осмыслять! smile 
А база PostgreSQL...

P.S.
А какие правильные характеристики должны быть у внешних ключей в таблице прибор-автомобиль?
ON UPDATE SET NULL ON DELETE SET NULL?


Это сообщение отредактировал(а) Лена - 2.7.2008, 15:08
PM MAIL   Вверх
Лена
Дата 2.7.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот вариант новый:

1. Таблица прибора:
ID прибора (пер. ключ)
Код прибора (заводской например, 1010000002) NOT NULL + UNIQUE тип integer
Пароль прибора (тоже заводской, например 0001) NOT NULL + UNIQUE тип строка
Примечание 

2. Таблица автомобиля:
ID автомобиля (пер. ключ)
Марка
Номерной знак
Фото автомобиля
Примечание

3. Таблица автомобиль_прибор:
ID автомобиль_прибор (пер. ключ)
ID прибора FK (связь с таб. приборы)
ID автомобиля FK (связь с таб. автомобили)
Дата установки прибора NOT NULL default current_date
Дата снятия прибора
Примечание
* характеристики обоих FK это ON UPDATE CASCADE ON DELETE CASCADE

4. Таблица водителя:
ID водителя (пер. ключ)
Фамилия NOT NULL – надо?
Имя
Отчество
Дата рождения
Телефон 1
Телефон 2
Адрес водителя
Фото водителя
Примечание

5. Таблица водитель_автомобиль:
ID водитель_автомобиль (пер. ключ)
ID водителя FK (связь с таб. водители)
ID автомобиля FK (связь с таб. автомобили)
Примечание
* характеристики обоих FK это ON UPDATE CASCADE ON DELETE CASCADE

6. Таблица сигналов идущего от прибора (лог сигналов):
ID пер.ключ, + 13 колонок для строки: 1010000002,20030217132813,121.646060,25.061725,20,157,133,7,0,11,15,0.096,0.000

Что не правильно и что добавить? smile 
PM MAIL   Вверх
Akina
Дата 2.7.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Я бы не стал накладывать уникальность на пароль прибора - мало ли...  smile 



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

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


Опытный
**


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

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



Вариант для проверки:  smile 

1. Таблица прибора:
ID прибора (пер. ключ)
Код прибора (заводской например, 1010000002) NOT NULL тип integer
Пароль прибора (тоже заводской, например 0001) NOT NULL тип строка
Примечание 

2. Таблица автомобиля:
ID автомобиля (пер. ключ)
Марка 
Номерной знак NOT NULL + UNIQUE тип строка
Фото автомобиля
Примечание

3. Таблица автомобиль_прибор:
ID автомобиль_прибор (пер. ключ)
ID прибора FK (связь с таб. приборы)
ID автомобиля FK (связь с таб. автомобили)
Дата установки прибора NOT NULL default current_date ???
Дата снятия прибора
Примечание

4. Таблица водителя:
ID водителя (пер. ключ)
Фамилия NOT NULL 
Имя
Отчество
Дата рождения
Телефон 1
Телефон 2
Адрес водителя
Фото водителя
Примечание

5. Таблица водитель_автомобиль:
ID водитель_автомобиль (пер. ключ)
ID водителя FK (связь с таб. водители)
ID автомобиля FK (связь с таб. автомобили)
Дата закрепления водителя на автомобиль NOT NULL default current_date ???
Дата открепления водителя
Примечание

6. Таблица сигналов идущего от прибора (лог сигналов):ID пер.ключ, + 13 колонок для строки: 1010000002,20030217132813,121.646060,25.061725,20,157,133,7,0,11,15,0.096,0.000

Все FK имеют ON UPDATE CASCADE ON DELETE CASCADE. Правильно? Не надо для FK NOT NULL?
Правильно ли NOT NULL default current_date устнавливать в таб. 5 и 3?
Какие еще есть замечания?  smile  

Это сообщение отредактировал(а) Лена - 2.7.2008, 17:18
PM MAIL   Вверх
Deniz
Дата 3.7.2008, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



С синтаксисом PostgreSQL не знаком.
Цитата(Лена @  2.7.2008,  20:16 Найти цитируемый пост)
Все FK имеют ON UPDATE CASCADE ON DELETE CASCADE. Правильно?
Я бы вообще запретил удалять записи из всех таблиц - 1, 2, 4, 6 это как справочники, а в 3 и 5 есть "Дата окончания действия записи", история таки нужна.
Цитата(Лена @  2.7.2008,  20:16 Найти цитируемый пост)
Не надо для FK NOT NULL?
обязательно, о чем может говорить запись в таблицах 3 и 5, например такая: ID водителя - 1, ID прибора - null ? Она просто не имеет смысла.
Цитата(Лена @  2.7.2008,  20:16 Найти цитируемый пост)
Правильно ли NOT NULL default current_date устнавливать в таб. 5 и 3?
NOT NULL правильно, про текущую дату, вопрос к бизнес логике. Можно и не делать.
Из замечаний: предлагаю в таблице автомобиля вынести "марку автомобиля" в отдельную таблицу или несколько, смотря что там предполагается вести. Например: TOYOTA COROLLA - добавить 2 таблицы, производители и модели, привязанные к производителям.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 3.7.2008, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Deniz @  3.7.2008,  07:03 Найти цитируемый пост)
Я бы вообще запретил удалять записи из всех таблиц

Для упрощения работы с актуальными данными, чтобы не лопатить каждый раз по датам, в таблицу 3 (и возможно 5) просто ввести поле актуальности записи. Индексированное есссно.


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

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


Опытный
**


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

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



Cпасибо! Есть над чем подумать... smile 
PM MAIL   Вверх
Deniz
Дата 3.7.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Цитата(Akina @  3.7.2008,  10:57 Найти цитируемый пост)
Для упрощения работы с актуальными данными, чтобы не лопатить каждый раз по датам, в таблицу 3 (и возможно 5) просто ввести поле актуальности записи. Индексированное есссно. 
и что в этом поле будет храниться? 0/1?
И зачем тогда этот неэффективный индекс?
Можно конечно и удалять записи(для уменьшения кол-ва записей), если прибор сняли с машины, но я считаю, что история важнее чем небольшое уменьшение производительности и увеличение текста SQL запроса:
Код
... where <RequestDate> between DateStart and coalesce(DateEnd, <RequestDate>)...



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 3.7.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Deniz, что эффективнее:
Код

where (<RequestDate> between DateStart and coalesce(DateEnd, <RequestDate>)) AND...

или
Код

where RecordValid AND ..

?


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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Akina, надеюсь мы не будем вступать в перепалку?  smile 
Я не говорил про эффективность запроса, только про создание индекса.
Причем я даже написал, что производительность немного ухудшится.
Если автор решит использовать статус записи(валидность) я не против, но индекс создавать не надо, оптимизатор все равно не будет его использовать, только дополнительные расходы на его содержание.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

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

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

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

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

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


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

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

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

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

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


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

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


 




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


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

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