Полиморфизм в таблицах базы данных SQL?

В настоящее время я использую следующее решение I найдено в группе google AngularJS.

$http
.post('/echo/json/', 'json=' + encodeURIComponent(angular.toJson(data)), {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
}).success(function(data) {
    $scope.data = data;
});

Обратите внимание, что если вы используете PHP, вам нужно будет используйте что-то вроде компонента HTTP Request::createFromGlobals() Symfony 2 HTTP, чтобы прочитать это, поскольку $ _POST не будет автоматически загружаться с ним.

24
задан Milen A. Radev 18 February 2009 в 15:48
поделиться

6 ответов

Право, проблема - Вы, хотят только один объект одного подтипа сослаться на любую данную строку родительского класса. При запуске с пример данный @Jay S, попробуйте это:

create table media_types (
  media_type     int primary key,
  media_name     varchar(20)
);
insert into media_types (media_type, media_name) values
  (2, 'TV series'),
  (3, 'movie');

create table media (
  media_id       int not null,
  media_type     not null,
  name           varchar(100),
  description    text,
  url            varchar(255),
  primary key (media_id, media_type),
  foreign key (media_type) 
    references media_types (media_type)
);

create table tv_series (
  media_id       int primary key,
  media_type     int check (media_type = 2),
  season         int,
  episode        int,
  airing         date,
  foreign key (media_id, media_type) 
    references media (media_id, media_type)
);

create table movies (
  media_id       int primary key,
  media_type     int check (media_type = 3),
  release_date   date,
  budget         numeric(9,2),
  foreign key (media_id, media_type) 
    references media (media_id, media_type)
);

Это - пример непересекающихся подтипов , упомянул @mike g.

<час>

Ре комментирует @Countably Богом и @Peter:

ВСТАВЛЯЮТ в две таблицы, потребовал бы два, вставляют операторы. Но это также верно в SQL любое время, у Вас есть дочерние таблицы. Это - обычная вещь сделать.

ОБНОВЛЕНИЕ может потребовать двух операторов, но некоторые бренды мультитаблицы UPDATE поддержки RDBMS с синтаксисом СОЕДИНЕНИЯ, таким образом, можно сделать это в одном операторе.

При запросах данных, можно сделать это просто путем запросов media таблица, если Вам только нужна информация об общих столбцах:

SELECT name, url FROM media WHERE media_id = ?

, Если Вы знаете, Вы запрашиваете фильм, можно получить определенную для фильма информацию с единственным соединением:

SELECT m.name, v.release_date
FROM media AS m
INNER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?

, Если Вы хотите информацию для данной записи медиа, и Вы не знаете то, что вводит ее, необходимо было бы соединить со всеми таблицами подтипа, зная, что только одна такая таблица подтипа будет соответствовать:

SELECT m.name, t.episode, v.release_date
FROM media AS m
LEFT OUTER JOIN tv_series AS t USING (media_id)
LEFT OUTER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?

, Если данные медиа будет фильм, то все столбцы в t.* будут ПУСТЫМИ.

27
ответ дан Community 28 November 2019 в 23:32
поделиться

Рассмотрите использование основной таблицы основных данных с таблицами, расширяющимися прочь его со специализированной информацией.

Напр.

basic_data
id int,
name character varying(100),
description text,
url character varying(255)


tv_series
id int,
BDID int, --foreign key to basic_data
season,
episode
airing


movies
id int,
BDID int, --foreign key to basic_data
release_data
budget
8
ответ дан Jay S 28 November 2019 в 23:32
поделиться

Так как Вы отметили этот PostgreSQL, Вы могли посмотреть http://www.postgresql.org/docs/8.1/static/ddl-inherit.html , но остерегаться протестов.

3
ответ дан MkV 28 November 2019 в 23:32
поделиться

То, что Вы ищете, называют 'непересекающимися подтипами' в реляционном мире. Они не поддерживаются в sql на уровне языка, но могут быть более или менее реализованы сверху sql.

2
ответ дан mike g 28 November 2019 в 23:32
поделиться

Вы могли составить одну таблицу с основными областями плюс uid затем раздвижные столы с тем же uid для каждого конкретного случая. Для запросов им нравятся отдельные таблицы, Вы могли создать представления.

1
ответ дан Chris Simpson 28 November 2019 в 23:32
поделиться

Используя подход с разделением подтипов, предложенный Биллом Карвином, как бы вы выполняли ВСТАВКИ и ОБНОВЛЕНИЯ, не выполняя их в два этапа?

Получение данных, Я могу представить представление, которое объединяется и выбирает на основе определенного media_type, но, AFAIK, я не могу обновить или вставить в это представление, потому что оно влияет на несколько таблиц (здесь я говорю о MS SQL Server). Можно ли это сделать без выполнения двух операций - и, естественно, без хранимой процедуры.

Спасибо

1
ответ дан 28 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: