2015-04-08 3 views
0

Я хочу создать базу данных MySQL с помощью следующих таблиц:комплекс SQL отношение

  • people, с одной записи на одного человека, и id индекса
  • shirts, с id индексом, каждая рубашка, принадлежащей человек, задается people_id поля, на котором мы можем установить отношение к первой таблице
  • pants, с id индексом, каждая из рубашки, принадлежащая к человеку, задается people_id поля, на котором мы можем установить отношение к первой таблице

Затем, в какой-то другой таблице, каждая запись относится к полностью одетому человеку, учитывая его people_id, shirt_id и pants_id. people_id не является абсолютно необходимым, так как мы можем найти его, ища владельца одежды.

Но для каждой записи владелец shirt_id и pants_id должен быть таким же, мы не хотим, чтобы кто-нибудь заимствовал одежду.

Можем ли мы применить это отношение к синтаксису сложного отношения? Или есть лучшая структура?

Спасибо!

+0

может ли человек иметь более одной рубашки? или брюки? –

ответ

0

Если конкретный pants_id должен принадлежать только одному человеку, и так же shirt_id я считаю, что создание двух UNIQUE индексов: первый в одиночку pants_id и второй только на shirt_id должен дать вам желаемый результат (это гарантирует, что в таблице , может быть только одна запись, содержащая каждый конкретный идентификатор).

Надеюсь, это поможет.

1

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

CREATE TABLE people (
    id integer primary key auto_increment, 
    name varchar(25) 
); 

CREATE TABLE shirts (
    id integer primary key auto_increment, 
    people_id integer, 
    foreign key (people_id) references people(id) 
); 

CREATE TABLE pants (
    id integer primary key auto_increment, 
    people_id integer, 
    foreign key (people_id) references people(id) 
); 

С этой структурой, любая строка в таблице shirts или pants может принадлежать только одна строке в таблице people, но любая строка в таблице people может иметь множество соответствующих записей в таблице shirts или pants.

Учитывая пару штанов с идентификатором «5», вы можете найти их владельца с помощью следующего запроса:

SELECT people.* 
    FROM people 
    INNER JOIN pants 
     ON pants.people_id = people.id 
    WHERE pants.id = 5; 

А также, если вы хотите, чтобы найти всю одежду, принадлежащие человеку, с идентификатором 7, вы могли бы сделать:

SELECT pants.*, shirts.* 
    FROM people 
    LEFT JOIN pants 
     ON pants.people_id = people.id 
    LEFT JOIN shirts 
     ON shirts.people_id = people.id 
    WHERE people.id = 7; 

редактировать мы используем LEFT JOIN здесь как указано ниже, потому что мы хотим, чтобы возвращать значения, даже если человек не имеет штаны, или рубашки, или либо.

Если с другой стороны, у всех может быть только одна рубашка и одна пара штанов, и вы все равно хотите сохранить их в своих собственных таблицах, вы можете сохранить приведенную выше структуру таблицы и обеспечить ограничение UNIQUE на people_id в обоих pants и shirts стол.

+1

Возможно, что 'left external join' может быть лучше в вашей последней выборке' select'. – danihp

+1

это было бы правдой. позвольте мне исправить это. –