C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Правильная связь таблиц  (Прочитано 1891 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Правильная связь таблиц
« : 22 Апрель 2015, 16:06:08 »

Путаюсь при создании правильных структур базы данных (назначение правильно вторичных ключей и т.п. бд PostgreSQL).
Мне надо создать три таблицы:
1. Таблица организаций.
2. Таблица помещений, которые принадлежат организациям.
3. Таблица датчиков установленных в этих помещениях.
Администратор базы данных в программе создает организацию (типа ООО Вымпел в торговом центре). Затем назначает этой организации помещения, которыми она владеет (к примеру, два помещения на первом этаже, одно на втором этаже и т.п.). Затем указывает, в каких помещениях этой организации и сколько в каждом помещении установлено датчиков. В одном помещении, к примеру, один датчик, в другом два и т.д.
Как связать правильно такие три таблицы? Помогите, пожалуйста, со структурой и ключами.
« Последнее редактирование: 24 Апрель 2015, 16:57:11 от SilverFish » Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: Правильная связь таблиц
« Ответ #1 : 27 Апрель 2015, 21:40:46 »

Не знаю базы даных PostgreSQL, но саму структуру я бысделал как-то так:

1 табл. - ид_организации, имя_организации, ид_помещения;
2 табл. -ид_помещения, имя_помещения, ид_датчика;
3 табл. -ид_датчика, имя_датчика;

Связь между 1 и 2, 2 и 3 - один ко многим...
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Правильная связь таблиц
« Ответ #2 : 27 Апрель 2015, 22:07:20 »

Необходимо к системе описанной в первом посте добавить таблицу пользователей. Таблица пользователей состоит из трех видов пользователей:
1. Супервизор.
2. Администратор.
3. Пользователь.
Все они имеют логин, пароль, имя, фамилию и т.д. Логин уникален.
Супервизор может делать все в базе данных. Создавать супервизоров, администраторов, пользователей, назначать администратору его организацию, создавать организации... Короче супервизор может делать все.
Администратор может делать все, только в рамках назначенной ему супервизором организации (например, создавать удалять помещения его конкретной организации, назначать пользователей и те помещения организации которые может видеть этот пользователь).
Пользователь организации не может ничего в базе данных. Он может просматривать только помещения организации которые ему назначил администратор организации. Как пример - у организации 10 помещений и два пользователя. Одному пользователю администратор разрешил просматривать все 10 помещений, а второму пользователю, администратор разрешил просматривать только три конкретных помещения. Просматривать это значить иметь доступ к датчикам в этих помещениях.

У мня получилось такое, не знаю все ли тут правильно:
Код
    CREATE TABLE organizations
   (
     id serial NOT NULL,
     "name" text NOT NULL,
     tel1 text,
     tel2 text,
     person text,--контактное лицо в организации
     prim1 text,
     CONSTRAINT pk_id PRIMARY KEY (id)
   );
 
 
 
   CREATE TABLE rooms
   (
     id serial NOT NULL,
     "name" text NOT NULL,
     tel text,
     person text,--контактное лицо в помещении
     prim1 text,
     CONSTRAINT pk_id_rooms PRIMARY KEY (id)
   );
 
 
   CREATE TABLE sensors
   (
     id serial NOT NULL,
     ser_num INTEGER NOT NULL,
     poverka TIMESTAMP WITHOUT TIME zone,--дата поверки датчика
     CONSTRAINT pk_id_sensors PRIMARY KEY (id)
   );
 
 
   CREATE TABLE users
   (
     id serial NOT NULL,
     permission INTEGER,--доступ: 0-супервизор, 1-администратор, 2-пользователь
     "login" text NOT NULL,
     "password" text NOT NULL,
     fam text NOT NULL,
     "name" text,
     otchestvo text,
     tel text,
     email text,
     CONSTRAINT pk_user PRIMARY KEY (id),
     CONSTRAINT unik_login UNIQUE (login)
   );
 
 
   CREATE TABLE users_rooms
   (
     id serial NOT NULL,
     id_users INTEGER,
     id_rooms INTEGER,
     START TIMESTAMP WITHOUT TIME zone,
     enddata TIMESTAMP WITHOUT TIME zone,
     CONSTRAINT pk_id_users_rooms PRIMARY KEY (id),
     CONSTRAINT fk_id_users_rooms FOREIGN KEY (id_rooms)
         REFERENCES rooms (id) MATCH SIMPLE
         ON UPDATE NO ACTION ON DELETE SET NULL,
     CONSTRAINT fk_id_users FOREIGN KEY (id_users)
         REFERENCES users (id) MATCH SIMPLE
         ON UPDATE NO ACTION ON DELETE SET NULL
   );
 
   CREATE TABLE rooms_sensors
   (
     id serial NOT NULL,
     id_rooms INTEGER,
     id_sensors INTEGER,
     START TIMESTAMP WITHOUT TIME zone,
     enddata TIMESTAMP WITHOUT TIME zone,
     CONSTRAINT pk_id_rooms_sensors PRIMARY KEY (id),
     CONSTRAINT fk_id_rooms_sensors FOREIGN KEY (id_rooms)
         REFERENCES rooms(id) MATCH SIMPLE
         ON UPDATE NO ACTION ON DELETE SET NULL,
     CONSTRAINT fk_id_sensors_rooms FOREIGN KEY (id_sensors)
         REFERENCES sensors(id) MATCH SIMPLE
         ON UPDATE NO ACTION ON DELETE SET NULL
   );
 
 
   CREATE TABLE organizations_rooms
   (
     id serial NOT NULL,
     id_organizations INTEGER,
     id_rooms INTEGER,
     START TIMESTAMP WITHOUT TIME zone,
     enddata TIMESTAMP WITHOUT TIME zone,
     CONSTRAINT pk_id_org_rooms PRIMARY KEY (id),
     CONSTRAINT fk_id_organizations FOREIGN KEY (id_organizations)
         REFERENCES organizations (id) MATCH SIMPLE
         ON UPDATE NO ACTION ON DELETE SET NULL,
     CONSTRAINT fk_id_rooms_organizations FOREIGN KEY (id_rooms)
         REFERENCES rooms(id) MATCH SIMPLE
         ON UPDATE NO ACTION ON DELETE SET NULL
 
   );
 
Записан
Valdemar
Давний друг


Сказали спасибо: +60/-4
Offline

Сообщений: 285


Re: Правильная связь таблиц
« Ответ #3 : 30 Апрель 2015, 16:00:48 »

А есть ли смысл создавать таблицы rooms_sensors и organizations_rooms?
Ведь каждый датчик может находиться только в одном помещении. Аналогично с помещениями, помещение принадлежит одной организации.
На мой взгляд, лучше в таблицу sensors добавить id комнаты, а в таблицу rooms добавить id организации. А так же другие требуемые поля из rooms_sensors и organizations_rooms.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Правильная связь таблиц
« Ответ #4 : 30 Апрель 2015, 18:02:09 »

Я поначалу так и думала. Задала вопрос на другом форуме в разделе где архитекторы баз данных т.к. долго не было ответа на этом форуме, а я в проектировании баз NULL.
На меня на том форуме наорали и сказали, что все неправильно.
Моя база была такой - Сообщ. #37
ссылка
Записан
Valdemar
Давний друг


Сказали спасибо: +60/-4
Offline

Сообщений: 285


« Ответ #5 : 05 Май 2015, 11:20:34 »

Если требуется хранить информацию о датчиках, которые уже нигде не установлены, то дополнительная таблица для связи действительно будет нужна (как Вам посоветовали на другом форуме).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.123 секунд. Запросов: 21.