Intereting Posts
Поддерживает ли SQLite репликацию? Что такое будущее Linq to SQL sql – запрос между двумя строками Как искать содержимое в рутине / (SP-Trigger-function) Поиск базы данных SQLite и использование значений из извлеченных строк для расчета SQL Identity, если входное значение в запросе вставки в ADO.NET не выдает исключение, что оно не может быть нулевым Преобразование данных из широкого формата в длинный формат в SQL OrientDB: как обновить столбец с помощью select query C # безопасно построить строку SQL для выполнения с использованием Entity Framework Отношение «многие ко многим»: используйте ассоциативную таблицу или разделительные значения в столбце? Ошибка входа. Вход из ненадежного домена и не может использоваться с аутентификацией Windows Внутренняя таблица Join по отношению к максимальному значению Сохранение IP-адреса в таблице Oracle SQL запрос, который будет подсчитывать и увеличивать количество повторяющихся экземпляров этой записи Выбор и листинг объекта Native Query для JPA

Как связаны эти таблицы?

Скажем, я запускаю онлайн-бизнес, где вы можете заказывать продукты с моего сайта, и у меня есть база данных с двумя таблицами:

Таблица order с поля order_number, customer_ID, address

customer таблицы с поля customer_ID, first_name, last_name

Чтобы получить полный, подробный «отчет» заказа, я бы выполнил LEFT JOIN, чтобы объединить данные из таблицы заказов, чтобы включить имя и фамилию клиента вместе с их адресом и порядковым номером.

Мой вопрос в том, как связаны эти таблицы? Они вообще? Как бы выглядела диаграмма отношений сущностей? Отдельно они, похоже, не взаимодействуют и больше похожи друг на друга на таблицы поиска.

У заказа всегда будет клиент, нет? Таким образом, это не левое, а внутреннее соединение.

Что их связывает, так это customer_id. Таким образом, ваш SQL просто:

 select o.order_number, o.customer_ID, o.address, c.first_name, c.last_name from orders o inner join customer c on o.customer_ID = c.customer_ID; 

Отношение сущностей:

Заказ клиента Customer_Id 0 … N> — + 1 Customer_Id … …

Схема сущности клиента-ордеров

Это отношение EF относится к базе данных SQL Server SQL Server Northwind. В этой тестовой базе данных, как и у вас, есть клиенты и заказы. Таблицы Customers и Orders связаны через поля CustomerId в обеих таблицах (это первичный ключ в Клиентах и ​​внешний ключ в таблице Orders). Когда вы моделируете это как отношение Entity, чем у вас есть диаграмма выше. У организации-клиента есть свойство навигации «Заказы» (через customerId), которое указывает на определенные поручения Клиента. Объект Order имеет свойство навигации, которое указывает на его Клиента (опять же через CustomerId). Отношение составляет от 1 до 0 или многих (1 – *), то есть у Клиента может быть 0 или более ордеров.

Когда вы присоединяетесь со стороны Клиента, вы используете LEFT join, «если вы хотите видеть всех Клиентов, независимо от того, у них есть ордер или нет» – 0 или более заказов. Если вы хотите видеть только тех, у кого есть Order (s), то вы используете внутреннее соединение.

Когда вы присоединяетесь со стороны Заказов, тогда у Ордена должен быть Клиент, поэтому он не может быть ЛЕВЫМ соединением. Это соединение INNER.

Вы можете проверить отношение с обеих сторон, используя поле CustomerId.

У вас не будет отдельной таблицы для «OrderId, CustomerId», поскольку это не отношение «многие ко многим» (это будет чистая избыточность и создаст аномалии нормализации).

Надеюсь, теперь это становится яснее.

В модели сущности-отношения мы не связываем таблицы. Вместо этого мы связываем объекты, которые представлены их ключевыми значениями. В вашем примере объект customer (представленный customer_ID ) имеет отношение «один ко многим» с сущностью order (представленным order_number ), и это отношение записывается в таблицу order (где order_number связан с customer_ID ). Если мы будем строго следовать модели ER, мы будем записывать (order_number, customer_ID) (отношение отношений) в отдельной таблице из (order_number, address) (отношение сущности).

Если есть ограничение внешнего ключа на order.customer_ID ссылающееся на customer.customer_ID , это отношение подмножества, которое гарантирует, что клиент каждого заказа является известным клиентом. Таким образом, отношение между таблицами и отношением между объектами – это не одно и то же.

Реляционная модель позволяет нам связывать (объединять) таблицы любым способом, который нам нужен. Очевидное соединение для вашего примера будет находиться в домене customer_ID с общим доменом, но я мог бы так же легко найти заказы, которые содержат имя пользователя last_name в его address доставки.

Схема ER для вашего примера может выглядеть так:

Диаграмма заказа клиента ER

Мой вопрос в том, как связаны эти таблицы? Они вообще? Как бы выглядела диаграмма отношений сущностей? Отдельно они, похоже, не взаимодействуют и больше похожи друг на друга на таблицы поиска.

Когда речь идет о моделировании данных в ER-диаграмме, больше в концептуальной модели, мы никогда не должны начинать думать о таблицах, первичных ключах, внешних ключах и т. Д., Поскольку это для более поздней модели концептуальной модели – логической модели.

Путем моделирования объектов в ER-Diagram мы всегда должны распознавать их по их атрибутам / свойствам. Объекты становятся конкретными, когда мы можем найти в них свойства. Здесь я чувствую недостаток контекста, поэтому я продолжу догадываться:

  • Если вам нужно сохранить продукты в своей базе данных, и вам нужно сохранить их атрибуты / свойства, то у нас есть объект Product.

  • Если вам необходимо сохранить клиентов / пользователей в своей базе данных вместе с
    их свойства / атрибуты, то у нас есть объект Customers.

Согласно тому, что вы сказали, клиенты могут покупать продукты. Таким образом, вы должны каким-либо образом связать эти два объекта. Имея это в виду, остановитесь и подумайте о следующем:

  • Вам нужно продолжать покупки / заказы.
  • Покупки / заказы показывают, какие пользователи купили какие продукты.

Соединив продукты и клиентов, что мы получим? Событие покупки / заказа, правильно?

Тогда у нас были бы две организации, относящиеся друг к другу, образующие событие покупки (или «заказы», ​​вы называете это). Это событие формируется необходимостью настоящих бизнес-правил (ваших правил). Вы, как модельер, должны постоянно выполнять заказы, и знаете, что продукты и клиенты связаны каким-то образом, поэтому вы можете создать связь между двумя объектами, представляющими событие заказов.

Как хорошо обсуждалось в других ответах, здесь необходимо разделение атрибутов. Если поле «адрес» находится там, где живет пользователь, а не где продукт будет доставлен, то этот атрибут должен существовать в объекте Customers.

Если это поле / атрибут / свойство является конечным местом доставки, оно должно оставаться в отношениях, созданных между двумя объектами, клиентами и продуктами.

Давайте поговорим о мощности. Если клиент может приобрести / заказать более одного продукта, и один и тот же продукт может быть приобретен более чем одним пользователем, то у нас есть связь NN здесь. Я считаю, что это ваше дело.

Основываясь на всем, что было сказано, мы находим следующую концептуальную модель:

введите описание изображения здесь

Разлагая эту модель и развивая логическую модель, мы бы получили:

введите описание изображения здесь

Теперь, по какой причине мы заканчиваем такую ​​модель?

Отношения NN допускают существование свойств / атрибутов (если необходимо), поэтому мы можем иметь атрибуты / свойства в отношении Orders, в результате чего в таблице ORDERS показываются поля. В этой таблице представлены покупки / заказы, сделанные пользователями / клиентами.

И по какой причине существование «Продуктов из заказов»?

Нам нужно сказать, какие продукты были приобретены, в каких покупках / заказах, особенно показывая, сколько из того же типа получено. В отношениях NN некоторые свойства индуцируют появление новых отношений, которые становятся таблицами позже. В таких ситуациях это зависит от владельца модели.

В сущности «Продукты из заказов» у нас есть составной первичный ключ, представленный внешними ключами.

С этим типом модели вы можете увидеть:

  • Какие пользователи совершили покупки / заказы.
  • Какие покупки / заказы были сделаны пользователями.
  • Какие продукты принадлежат к покупкам / заказам.
  • Какие продукты были приобретены пользователями.
  • Сколько товаров типа было куплено / заказано.

Используя поле даты, вы можете узнать, сколько покупок было сделано в периоды:

  • Недели.
  • Месяцы.
  • Годы.
  • Четверти.
  • И т.п.

Если вы заинтересованы, см. Также:

Ошибка ER диаграммы

Если у вас есть какие-либо вопросы, прокомментируйте и я отвечу. Я надеюсь, что немного помог.

Приветствия.

«Связанный» – неопределенный и запутанный термин. Это связано с тем, что «отношения» используются двумя способами: «ассоциация» (между значениями) и «внешний ключ» (между таблицами).

Вам не нужно ничего знать о том, как таблицы «связаны» с помощью внешних ключей или общих столбцов для запроса. Важно то, как значения в строках результатов запроса связаны / связаны с запросом. Важные отношения / ассоциации (представлены) таблицами .

С реляционной точки зрения, будет внешний ключ от заказа, ссылающегося на клиента на customer_id.

Диаграмма ER в стиле Чэня будет иметь типы ордеров и заказчиков (коробки) и тип отношений Заказы (бриллиант) с участием (строк) от Приказов к заказу и Клиенту. У него будет таблица для каждого типа. Это пример совершенно разумного реляционного дизайна, который не может захватить модель ER с ее искусственным и извращенным различием между сущностями и отношениями. Тем не менее, люди будут использовать дизайн базы данных, такой как ваш, для реализации такого дизайна ER. Хотя дизайн ER не является, то, дизайн.

При использовании базы данных значения используются для идентификации объектов или имен свойств и величин. Каждая базовая таблица содержит строки значений, которые участвуют в некоторой взаимосвязи / ассоциации, заданной администратором баз данных. Каждый результат запроса содержит строки значений, которые участвуют в отношении / ассоциации, которая представляет собой комбинацию условий и отношений / ассоциаций базовых таблиц, которые она упоминает. Все, что вам нужно знать для запроса, это отношения / ассоциации таблиц.

 Order -- order ORDER_NUMBER is by customer CUSTOMER_ID to address ADDRESS Customer -- customer CUSTOMER_ID is named FIRST_NAME LAST NAME Order JOIN (Customer WHERE FIRST_NAME='Eddie') -- order ORDER_NUMBER is by customer CUSTOMER_ID to address ADDRESS AND customer CUSTOMER_ID is named FIRST_NAME LAST NAME AND FIRST_NAME='Eddie' 

Иногда значения для списка столбцов в строке одной таблицы также должны отображаться как значения для списка столбцов в другой таблице или этой таблице. Это связано с тем, что если перечисленные значения и другие удовлетворяют отношениям / ассоциации одной таблицы, тогда перечисленные значения и другие будут удовлетворять отношениям / ассоциации другой таблицы.

 /* IF there exist ORDER_ID & ADDRESS satisfying order ORDER_NUMBER is by customer CUSTOMER_ID to address ADDRESS THEN there exist FIRST_NAME & LAST_NAME satisfying customer CUSTOMER_ID is named FIRST_NAME LAST_NAME */ FOREIGN KEY Order(customer_id) REFERENCES Customer(customer_id) 

Это означает, что эти конкретные таблицы и списки столбцов удовлетворяют (одному и только) отношениям / ассоциациям «внешний ключ в этой базе данных» . (И база данных будет иметь таблицу метаданных для отношения / ассоциации внешнего ключа).

Мы говорим, что «есть внешний ключ» из списка столбцов первой таблицы во второй столбец столбцов таблицы. Для базы данных существует только одна связь / связь с внешним ключом. Когда есть внешний ключ, его таблицы и списки столбцов удовлетворяют отношениям внешнего ключа этой базы данных . Но внешний ключ не является отношением / ассоциацией. Люди называют внешние ключи «отношениями», но это не так.

Но внешние ключи не имеют значения для запросов! (То же самое для любого другого ограничения). Результат запроса содержит строки, значения которых (сущность и информация о свойствах) связаны / связаны с отношением / связью этого запроса , построенными из условий и связей / ассоциаций базовых таблиц .