Запутался в сущностях моста и сущностях с несколькими атрибутами

У меня просто несколько вопросов, которые меня смущают. Мне не удалось отобразить мою диаграмму ошибок в этом посте, поэтому мне пришлось создать ее «текстовую» версию.

Entity: customers
    Attributes: 
                cus_id -- primary key
                cus_fname -- multi-attribute (name)
                cus_lname -- multi-attribute (name)
                cus_gender -- multi-attribute (name)
                cus_dob

Entity: products
    Attributes:
                prod_id -- primary key
                prod_name
                prod_cost
                prod_retail

Bridge Entity: buys
    Attributes:
                prod_id
                cus_id
---------------------------------------

CREATE TABLE customers (
    cus_id        NUMBER(5,0)
                  CONSTRAINT cus_id_pk
                  PRIMARY KEY (cus_id),
    cus_fname     VARCHAR2(32),
    cus_mname     VARCHAR2(32),
    cus_lname     VARCHAR2(32),
    cus_gender    NUMBER(1,0),
    cus_dob       DATE
);
-----------------------------------------
CREATE TABLE products (
    prod_id       NUMBER(5,0)
                  CONSTRAINT cus_id_pk
                  PRIMARY KEY (cus_id),
    prod_name     VARCHAR2(32),
    prod_cost     NUMBER(4,2),
    prod_retail   NUMBER(4,2)
);

1. Как создать мост? Итак, моя организация-мост называется покупками, как мне это сделать? Я посмотрел в Интернете, но все, что я вижу, - это отдельные утверждения.

  1. Как мне создать многозначный атрибут? Как и имя покупателя, это многозначный атрибут.

  2. Должен ли я также включать NOT NULL в первичные ключи? Я думаю о добавлении NOT NULL к именам клиентов.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
488
1

Ответы 1

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

Определение таблицы для ассоциативной таблицы может выглядеть примерно так:

CREATE TABLE buys
( prod_id  NUMBER(5,0) NOT NULL COMMENT 'composite PK, FK ref products.prod_id'
, cus_id   NUMBER(5,0) NOT NULL COMMENT 'composite PK, FK ref customers.cus_id'
, PRIMARY KEY (prod_id, cus_id) 
, UNIQUE KEY buys_UX1 (cus_id, prod_id)
, CONSTRAINT FK_buys_products FOREIGN KEY (prod_id) REFERENCES products (prod_id) 
  ON DELETE CASCADE ON UPDATE CASCADE     
, CONSTRAINT FK_buys_customers FOREIGN KEY (cus_id) REFERENCES customers (cus_id) 
  ON DELETE CASCADE ON UPDATE CASCADE     
) ENGINE=InnoDB
;

Примечание. Я не верю, что NUMBER(5,0) является допустимым типом данных MySQL. Для столбцов первичного ключа я обычно использую целочисленный тип данных, INT или BIGINT. Но столбцы внешнего ключа должны ТОЧНО соответствовать типу данных ссылочных первичных столбцов, поэтому я использовал NUMBER(5,0) как копию типа данных ссылочных столбцов.


Многозначный атрибут может быть реализован как дочерняя таблица с отношением «один ко многим». Но я не вижу никаких указаний на многозначный атрибут в модели.

Составной атрибут может быть реализован в виде отдельной таблицы. Но я бы не пошел туда, если бы не был вариант использования, делающий это выгодным.

Лично я предпочитаю обрабатывать составные атрибуты просто префиксом имен столбцов. Например, как указание на то, что эти столбцы являются компонентами атрибута «имя» ...

 cus_name_title
 cus_name_last
 cus_name_first
 cus_name_suffix

Аналогично для атрибута "почтовый адрес"

cus_addr_street
cus_addr_line2
cus_addr_city
cus_addr_state
cus_addr_postal_code

(Некоторые другие реляционные базы данных поддерживают объявление составных «типов»; я не верю, что эта функция доступна в MySQL. (И я бы не стал представлять составной атрибут как объект JSON).)

Ограничение PRIMARY KEY уже применяет NOT NULL ко всем столбцам первичного ключа. Но не помешает также явно включить ограничение NOT NULL. Я предпочитаю добавлять ограничение NOT NULL в любой столбец, в котором мы не хотим принимать значения NULL.

СЛЕДОВАТЬ ЗА

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

Мы можем создать таблицу с внешним ключом, ссылаясь на cus_id в customers.

 CREATE TABLE cus_phone_numbers 
 ( id            INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'PK'
 , cus_id        NUMBER(5,0) NOT NULL COMMENT 'FK ref customers.cus_id'
 , phone_type    VARCHAR(80)  COMMENT 'e.g. main, mobile, office, fax'
 , phone_number  VARCHAR(80)
 , CONSTRAINT FK_cus_phone_numbers_customers 
   FOREIGN KEY (cus_id) REFERENCES customers (cus_id)
   ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB 
 ;

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

  cus_id   phone_type    phone_number
  ------   ----------    ---------------
      42   main 1        xxx-xxx-1111
      42   office        xxx-xxx-1212
      42   fax           xxx-xxx-3333
     112   service       xxx-xxx-7701
     112   delivery      xxx-xxx-7702

Это атрибуты многозначный ... и атрибут объекта, который может иметь ноль, одно или несколько значений.


Атрибут составной состоит из нескольких атрибутов компонентов. Например, атрибут «имя» клиента может быть комбинацией нескольких простых атрибутов:

 title/salutation        'Major'
 first name              'Charles'
 middle name             'Emerson'
 last name               'Winchester'
 suffix                  'III'
 nickname                ''

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

Рассмотрим атрибут «номер телефона». Это можно смоделировать как составной атрибут:

country code        +1
area code           888
exchange number     467
line number         4355

Спасибо за ответ. Это было очень полезно. У меня только один вопрос. Вы сказали, что для многозначных атрибутов я должен создать дочернюю таблицу. Что ты имеешь в виду? Как мне создать дочернюю таблицу и связать ее с основной таблицей. Итак, для моей диаграммы cus_fname (имя), cus_mname (отчество) и cus_lname (фамилия) являются многозначными атрибутами, которые должны быть в таблице клиентов.

James Coles 15.05.2018 06:04

Атрибут многозначный может быть простым или составным. Атрибут составной не обязательно является многозначным. Составной атрибут состоит из других атрибутов. «Имя» клиента - это составной атрибут. Назначим "cus_name" в качестве имени составного атрибута. Это не будет имя столбца в таблице, у нас будут столбцы для компонентов. Если мы будем следовать предложенному вами соглашению о fname, lname, mname, я бы назвал столбцы cus_name_fname, cus_name_lname, cus_name_mname. Общий префикс cus_name_ указывает, что эти столбцы являются компонентами.

spencer7593 15.05.2018 15:21

Другие вопросы по теме