Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите - спроектировать таблицы адреса для таблицы фирм
 
 автор: davidoff_72   (25.12.2014 в 15:11)   письмо автору
100.6 Кб
 
 

Цель - спроектировать таблицу фирма у которой есть филиалы и адрес

Сущности:
1. фирма (таблица)
2. филил

у одной фирмы может быть множество филиалов.
Фирма и филиал имеют адрес.
Адрес состоит из:
1. страна (таблица)
2. город (таблица)
3. улица (таблица)
4. дом, офис.

Вопрос - какие таблицы необходимо создать и как их взаимосвязать?
Спасибо.

  Ответить  
 
 автор: KPETuH   (25.12.2014 в 15:37)   письмо автору
 
   для: davidoff_72   (25.12.2014 в 15:11)
 

Есть ли смысл для филиалов отдельную таблицу? Возможно стоит добавить в таблицу Фирма поле parent_id в которую заносить (0 или null) если фирма и id фирмы если это филиал.

  Ответить  
 
 автор: davidoff_72   (25.12.2014 в 15:43)   письмо автору
 
   для: KPETuH   (25.12.2014 в 15:37)
 

Не знаю, я начинающий проектировщик. филиал должен иметь теже атрибуты, что и фирма - свой адрес, свои контакты, только привязка к названию фирмы и указание, что это филиал. Как правильно, подскажите?

  Ответить  
 
 автор: Лена   (25.12.2014 в 18:04)   письмо автору
 
   для: davidoff_72   (25.12.2014 в 15:43)
 

Если абсолютно одинаковые аттрибуты, то тогда так, как сказал KPETuH:
company

id_company
parent_id
name_company
id_address
sorting

address

id_address
id_country
id_city
id_sreet
office
id_company

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

  Ответить  
 
 автор: Trianon   (26.12.2014 в 01:03)   письмо автору
 
   для: Лена   (25.12.2014 в 18:04)
 

Мое почтение.


Для адресов у меня придумалась такая вот схема.
Таблица фрагментов адреса Chunks (здесь живут номера объектов и их имена собственные, такие как Эквадор)
Таблица типов фрагментов адреса Terms (здесь живут имена нарицательные, такие как республика)

привожу сразу с примерами.


-- 
-- БД: `Address`
-- 
-- --------------------------------------------------------
-- 
-- Структура таблицы `Terms`
-- 
DROP  TABLE IF EXISTS `Terms`;
CREATE TABLE `Terms` (
  `Id` int(11) NOT NULL auto_increment,
  `defform` enum('pr','su','no') default NULL,
  `name` varchar(64) default NULL,
  `abbr` varchar(20) default NULL,
  PRIMARY KEY  (`Id`),
  UNIQUE KEY `name` (`name`)
) TYPE=MyISAM AUTO_INCREMENT=41;

-- 
-- Дамп данных таблицы `Terms`
-- 

INSERT INTO `Terms` (`Id`, `defform`, `name`, `abbr`) VALUES 
(11, 'no', 'страна', NULL),
(12, 'su', 'область', 'обл.'),
(13, 'pr', 'город', 'г.'),
(14, 'pr', 'республика', 'респ.'),
(15, 'pr', 'поселок', 'пос.'),
(16, 'pr', 'деревня', 'дер.'),
(17, 'pr', 'село', 'с.'),
(18, 'su', 'шоссе', 'ш.'),
(19, 'su', 'дорога', NULL),
(20, 'pr', 'улица', 'ул.'),
(21, 'su', 'проспект', 'пр.'),
(22, 'su', 'переулок', 'пер.'),
(23, 'su', 'проезд', 'пр-д'),
(24, 'pr', 'бульвар', 'бул.'),
(25, 'pr', 'площадь', 'пл.'),
(26, 'pr', 'станция', 'ст.'),
(27, 'pr', 'платформа', 'пл.'),
(28, 'pr', 'река', 'р.'),
(29, 'su', 'мост', 'м.'),
(30, 'su', 'ручей', 'р.'),
(31, 'pr', 'корпус', 'к.'),
(32, 'pr', 'дом', 'д.'),
(33, 'pr', 'строение', 'стр.'),
(34, 'pr', 'помещение', 'пом.'),
(35, 'pr', 'квартира', 'кв.'),
(36, 'no', 'центр', NULL),
(37, 'su', 'двор', 'дв.'),
(38, 'su', 'дворец', 'дв.'),
(39, 'su', 'аллея', 'ал.'),
(40, 'pr', 'штат', 'шт.'); ;
-- --------------------------------------------------------

-- 
-- Структура таблицы `Chunks`
-- 
DROP TABLE IF EXISTS `Chunks`;
CREATE TABLE `Chunks` (
  `Id` int(11) NOT NULL auto_increment,
  `parent` int(11) default NULL,
  `term` int(11) default NULL,
  `form` enum('pr','su','no') default NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY  (`Id`),
  UNIQUE KEY `gen` (`parent`,`name`)
) TYPE=MyISAM AUTO_INCREMENT=130;

-- 
-- Дамп данных таблицы `Chunks`
-- 

INSERT INTO `Chunks` (`Id`, `parent`, `term`, `form`, `name`) VALUES 
(101, NULL, 11, NULL, 'Российская Федерация'),
(102, 101, 13, NULL, 'Санкт-Петербург'),
(103, 102, 21, NULL, 'Московский'),
(104, 102, 21, NULL, 'Ленинский'),
(105, 102, 21, 'pr', 'Ветеранов'),
(106, 102, 20, 'su', 'Народная'),
(107, 102, 20, NULL, 'Дыбенко'),
(108, 102, 20, NULL, 'Фаворского'),
(109, 108, 32, NULL, '12'),
(110, 107, 32, NULL, '27'),
(111, 110, 31, NULL, '1'),
(112, 106, 32, NULL, '2'),
(113, 104, 32, NULL, '103'),
(114, 103, 32, NULL, '147'),
(115, 102, 21, NULL, 'Гражданский'),
(116, 115, 32, NULL, '18а'),
(117, 102, 21, NULL, 'Богатырский'),
(118, 117, 32, NULL, '15'),
(119, 102, 18, NULL, 'Выборгское'),
(120, 119, 32, NULL, '503'),
(121, 120, 31, NULL, '2'),
(122, 102, 21, NULL, 'Дунайский'),
(123, 123, 32, NULL, '64'),
(124, 102, 20, NULL, 'Тельмана'),
(125, 124, 32, NULL, '31'),
(127, 101, 13, NULL, 'Москва'),
(128, 127, 18, 'pr', 'Энтузиастов'),
(129, 102, 21, 'pr', 'Энтузиастов');

-- --------------------------------------------------------

form(defform) - поле несущественное
оно определяет лишь писать ли имя типа фрагмента перед (prefix) или после (suffix)
имени самого фрагмента ( а ля Дунайский проспект vs проспект Ветеранов и т.п.)

  Ответить  
 
 автор: Лена   (27.12.2014 в 20:33)   письмо автору
 
   для: Trianon   (26.12.2014 в 01:03)
 

>Мое почтение.
Взаимно :)

Мне такая структура только пару раз попадалась. В основном для каждого фрагмента адреса лепят отдельное поле в таблице и часто поле в базе называется так, как называется поле формы, которую заполняет пользователь.
Мне кажется, структура таблиц для адреса зависит от интерфейса, с которым будут работать пользователи. Допустим, филиал находится в Москве. Спустя время он переехал в Ростов. Тот, кто работает с системой, должен зайти в админку и поменять город, чтобы это сообщить "главной фирме" и другим филиалам. Для этого пользователь должен увидеть выпадающий список городов. Как программисту, основываясь на вашей структуре, вывести этот список на страницу?
SELECT * FROM `Chunks` WHERE term = 13.
Или я хочу вывести на страницу список областей, стран и т.д. Мне такая жесткая привязка к конкретному числу не очень нравится.

Второе. На странице есть форма для ввода адреса. В ней несколько полей - штат, улица, дом и т.д. INSERT-то я сделаю, как мне UPDATE поля сделать, если адрес поменялся? У меня, например, был проспект Ленинский, а стал Ветеранов? ((104, 102, 21, NULL, 'Ленинский'), )
Как мне в таблице `Chunks` найти нужное значение?

  Ответить  
 
 автор: Trianon   (28.12.2014 в 00:37)   письмо автору
360.8 Кб
 
   для: Лена   (27.12.2014 в 20:33)
 

Вот как раз терм область я забыл добавить. И про край забыл и про округ.
Это тем более странно, что структура вся рождалась под воздействием того факта,
что в России на данный момент на первом уровне деления наравне с областями 4 города федерального значения, и еще дофига краев и округов. См. скриншот с goguslugi.ru
Так что просто поменять Москву на Ростов удастся врядли.

Насчет привязки к конкретному числу - да ни боже ж мой!
Как вывести список стран? Да в лоб:
SELECT * FROM `Chunks` WHERE term = 
  (SELECT Id FROM ``Terms` WHERE name = 'страна') 

ну или если сложный запрос не нравится, то джойном:
SELECT * FROM `Chunks` c JOIN ``Terms` t ON c.`term` = t.`Id` WHERE t.`name` = 'страна' 


Как менять адрес?
Через UPDATE - врядли. Скорее через INSERT нового элемента или даже цепи элементов.

  Ответить  
 
 автор: davidoff_72   (30.12.2014 в 12:52)   письмо автору
 
   для: Trianon   (26.12.2014 в 01:03)
 

Спасибо

  Ответить  
 
 автор: davidoff_72   (30.12.2014 в 12:48)   письмо автору
 
   для: Лена   (25.12.2014 в 18:04)
 

Спасибо. В будущем таблицу адресов ещё предполагается использовать в связи с таблицей сотрудник - адрес проживания сотрудника. Подойдёт ли данная модель?

  Ответить  
 
 автор: Лена   (02.01.2015 в 16:35)   письмо автору
 
   для: davidoff_72   (30.12.2014 в 12:48)
 

Я так и думала :) Всегда там, где филиалы, есть контакты.
Подойдет. И то, что посоветовал Trianon- тоже.
Таблица сотрудников:
contact

id_contact
id_adress - привязка к таблице адреса
**** - поля, которые описывают сотрудника

Вообще, если что-то проектируете, лучше взять ручку и нарисовать на листке все таблицы и связи между ними - так сразу все видно, хорошая структура или нет. Я так делаю, если документации к проекту не требуют и красоты особо не нужно (в противном случае можно использовать MySQL Workbench).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования