|
|
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть текстовое описание задания. Но суть даже не в решении задания. Описание самой БД очень примитивное. Описаны только сами таблицы, поля на уровне просто названий. Никак не могу понять возможную структуру такой БД? Где первичные ключи, какие связи и т.д. Вот описание: авторВ базе данных есть следующие таблицы: order - заказы - id - code order_status - статусы заказов - id - code - desc order_status_history - история статусов заказов - order_id - status_id - date - time Из того, что сам понимаю точно: order.id - первичный ключ таблицы order_status.desc - текстовое описание статуса заказа order_status_history.date - дата присвоения данного статуса заказа order_status_history.time - время присвоения данного статуса заказа Что означают поля order.code, order_status.id, order_status.code, order_status_history.order_id и order_status_history.status_id и главное как организуется связь между таблицами (первичные и внешние ключи) в упор понять не могу. Уже несколько листочков разрисовал с возможными схемами - без толку. Может меня просто клинит и кто-то предложит какой-то очевидный вариант) Заранее признателен за любую помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 16:45 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
gammaray Вот описание: авторВ базе данных есть следующие таблицы: order - заказы - id - code order_status - статусы заказов - id - code - desc order_status_history - история статусов заказов - order_id - status_id - date - time имхо все вполне очевидно gammarayЧто означают поля order.code, естественный ключ (в отличие от суррогатного ID) таблицы order gammarayorder_status.id, order_status.code, то же самое - суррогатный и естественный ключи order_status gammaray order_status_history.order_id и order_status_history.status_id внешние ключи на order.id и order_status.id соответственно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 18:19 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
gammaray, Как то все мрачно с описанием... order.code - это похоже код заказа в системе, скорее всего текстовый, решено не привязываться к id и это правильно, но похоже его сделали ключом, а это уже не очень, и хотя формат кода заказа типа Z-2017-000000525 позволит обеспечить его уникальность в системе, я бы предпочел другую схему - где история живет сама по себе, типа лог и всё тут... В общем слева схема БД согласно вашему описанию, в истории хранится только дата и время, а статус(desc) и код заказа(code) вытаскиваются из главных таблиц... справа - как бы я делал, тупо лог: реальный код заказа, статус, дата, время.... И еще... как-то не очень имена полей в таблицах делать схожими с возможными созвучными функциями СУБД - ов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 18:56 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
мдя... счас смотрю на свой вариант справа... переделал бы... 1. Или убрал order_status_history вообще, а date_ и time_ закинул в order_status, тогда действующий статус заказа это тот у которого старшие date_ и time_ 2. Или убрал бы order_status вообще, а desc сделал бы в order и оставил историю... Но это уже не важно, слева имхо то, что вы просили.... я так думаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 19:07 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
vmagмдя... счас смотрю на свой вариант справа... переделал бы... Сейчас еще немного посмотрите, подумаете, решите добавить словарь возможных статусов и вернетесь к схеме ТС :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 19:42 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Кот Матроскинрешите добавить словарь возможных статусов так вроде этого нет и в схеме ТС (по крайней мере в явном виде)... и мне не нравится в исходнике связь code-code один к одному, впрочем может её и нет, ибо то что слева нарисовано - чисто моя интерпретация в попытке изобразить более-менее рабочее из не явного описания... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 20:54 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, Прочитал ваш первый пост (я пока таблички рисовал его вообще не видел)... скорее всего вы правы... с толку сбивает code в order_status... на самом деле он скорее всего никакого отношения к code в order не имеет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 21:06 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Кот Матроскинестественный ключ (в отличие от суррогатного ID) таблицы order А естественные ключи (code) в таблицах при этом совпадают? Если да, то это разве не избыточность данных в этом случае? По id понятно таблицы связаны, а тут дублирующаяся инфа в двух разных таблицах, которую еще и "вручную" надо копировать. Вообще тогда странно выглядит таблица order_status и сомнительна ее необходимость: проще поле desc в таблицу order перенести и удалить таблицу order_status. Кот Матроскинвнешние ключи на order.id и order_status.id соответственно Опять же дублирование информации - нет? Эти же значения совпадают (order.id и order_status.id). Так зачем тогда хранить одинаковые значения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 11:37 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
vmag, спасибо за Ваши рисунки. Последний вариант интересный (хотя и кривой по мне в плане организации). Но тогда хотя бы там избыточность данных только в плане поля code (если оно конечно совпадает в двух разных таблицах). Непонятен смысл существования отдельной таблицы order_status. По сути связь с order 1 к 1. Так почему бы не объединить в одну таблицу их, просто перенеся поле desc? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 11:43 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
gammaray, Поля CODE в этих таблицах совершенно разные. Я бы вообще переименовал их в ORDER_CODE и STATUS_CODE соответственно. В том CODE, что в таблице ORDER - код заказа, например "ЗКЗ-225/ы". Он у каждого заказа свой, чтобы клиент и исполнитель смогли понять друг друга в диалоге "- Где мой заказ? - Какой заказ?". В том CODE, что в STATUS - значения "Принят к исполнению", "Требует уточнения", "Исполнен", "Отказано", и что там еще с любым заказом может случиться. В Desc - подробные пояснения к каждой ситуации. Таблица STATUS относится к HISTORY как один-ко-многим: многие заказы в разное время принимают один статус. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 12:36 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, да, согласен, Ваш вариант вполне возможен. Но неужели тогда нельзя было в формулировке вопроса эти поля код назвать по разному, чтобы не вводить в заблуждение?... Вопрос риторический) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 14:12 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
gammarayCane Cat Fisher, да, согласен, Ваш вариант вполне возможен. Но неужели тогда нельзя было в формулировке вопроса эти поля код назвать по разному, чтобы не вводить в заблуждение?... Вопрос риторический) Скорее религиозный. Некоторые полагают, что названия полей должны быть уникальны в пределах БД. Тогда не потребуется никаких дополнительных переименований для полей внешних ключей, и при комбинировании полей в запросах (кроме случаев, когда таблица в запросе участвует более одного раза). Другие считают, что названия полей должны быть минимизированы - грубо говоря, ID, и CODE в каждой таблице, а другие имена должны использоваться по необходимости - внешние ключи должны называться ORDER_ID, STATUS_ID и т.д., а в запросе, если нужны оба CODE - использовать алиасы ORDER_CODE, STATUS_CODE. Я склоняюсь скорее к первому варианту. Составитель задания, видимо - ко второму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 14:38 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Всю голову уже изломал над реализацией задания при схеме БД, к которой в итоге пришли (последняя схема от vmag). Задание следующее: авторНеобходимо написать SQL-запрос, который будет для каждого заказа выводить текущий статус, а также дату и время, с которого заказ находится в этом статусе. Для простоты реализовал все это в Access, заполнил данными и пробовал написать запросы. Вот данные трех таблиц (2 заказа, один завершен, второй находится на 2 стадии статуса, всего 4 статуса заказа) в порядке order, order_status и order_status_history: Попытался сделать запросы. Получилось два рабочих варианта, решающие подзадачи самой задачи: Код: sql 1. 2. Выводит id заказа (из таблицы order), все статусы заказа и времена присвоения этих статусов (а нужно оставить по идее ТОЛЬКО строчку с максимальной датой И максимальным временем одновременно). Код: sql 1. Выводит последние времена изменения статусов заказов. Но тут нет связи с другими таблицами. Всю голову изломал, как сделать итоговый верный запрос... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2017, 18:12 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Вот такой монстр в итоге родился... Код: sql 1. 2. 3. 4. 5. Ну хотя бы результат выдает верный: Но все таки кажется, что можно как-то несколько короче это написать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2017, 20:56 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Продолжаю мыслить в слух. Приведенный запрос будет работать правильно только в том случае, когда и дата и время последнего изменения статуса для одного и того же заказа будут одновременно максимальны. Например, случае таких пар дата/время 03.05.2017 17:00 и 04.05.2017 11:00 запрос не выдаст искомое 04.05.2017 11:00, а вообще ничего не выдаст. Так что вопрос остается открытым... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2017, 21:38 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
Вот так вроде работает Код: sql 1. 2. 3. 4. 5. Но все же надеюсь, что кто-то предложит более короткое и красивое решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2017, 21:49 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
gammarayВот так вроде работает Код: sql 1. 2. 3. 4. 5. Но все же надеюсь, что кто-то предложит более короткое и красивое решениеВ чем сакральный смысл разделения даты и времени на 2 части ? Чтобы при поиске Engine, кроме сравнения, приходилось выполнять ещё и вычисление ? Избавьтесь от этого и запрос становится практически элементарным и более понятным для оптимизатора. Разумеется, при наличии правильных индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2017, 07:22 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
ChA, сакральный смысл в том, что таково задание. Я уже писал тут не раз, что такая организация структуры хранения мне мягко говоря самому непонятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 16:37 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
gammarayтаково задание. Я уже писал тут не раз, что такая организация структуры хранения мне мягко говоря самому непонятна.Может те кто ставил задачу, просто видел время и дату в разных полях, но это вовсе не повод так же их и хранить. Если кто-то сознательно настаивает на такой реализации, то это повод задуматься, а стоит ли иметь дело с таким постановщиком, так как ни одного разумного повода хранить время и дату отдельно не существует, если они обязательно нужны оба для фиксации момента времени. Практически в любом диалекте SQL существуют функции, позволяющие выделять только дату или только время, вот и применяйте их при вывода, а хранить надо в одном поле. И запросы станут более вменяемыми. Вычисление при поиске - лучший способ создания себе и заказчику проблем, а вот при выводе можно извращаться как угодно. Надо разделять задачи хранения и представления данных. Впрочем, настаивать не буду, можно ещё и время разделить, скажем, ещё на 4 поля часы, минуты, секунды и миллисекунды, а дату на год, месяц и день. И все хранить в числовом виде. Или символьном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 23:46 |
|
||
|
Структура БД
|
|||
|---|---|---|---|
|
#18+
ChA, да поймите Вы, что это просто задание из теста по поводу вакансии в одну контору. Я им уже итак все рассказал, что про них думаю с такой формулировкой задания. И самый прикол, что по задумке выполнение всего теста занимает 1-2 часа, а тут я на первом вопрос завис тогда часов на 5-6 точно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2017, 16:56 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=39446936&tid=1540181]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 486ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...