Как смоделировать базу данных, где одна страница может иметь разные типы контента? - PullRequest
2 голосов
/ 07 сентября 2010

У меня есть таблица базы данных страница с полями contenttype_id и content_id . Я хочу связать страницу с contenttype через contenttype_id и обратиться к фактическому content через content_id . Проблема в том, что содержимое зависит от contenttype_id и моделируется по-разному, поэтому content_id относится к различным таблицам в зависимости от contenttype_id .

CREATE TABLE "page"
("id" "INT",
"author" "VARCHAR(45)",
"created" "DATE",
"content_type" "INT",
"content_id" "INT")

CREATE TABLE "contenttype"
("id" "INT",
"name" "VARCHAR(45)")

CREATE TABLE "content_redirect"
("id" "INT",
"url" "VARCHAR(45)")

CREATE TABLE "content_script"
("id" "INT",
"url" "VARCHAR(45)",
"params", "VARCHAR(45)")

CREATE TABLE "content_text"
("id" "INT",
"text" "TEXT")

CREATE TABLE "content_process"
("id" "INT",
"step1" "TEXT",
"step2" "TEXT",
"step3" "TEXT")

CREATE TABLE "content_extprocess"
("id" "INT",
"system_id" "INT",
"process_id" "INT")

Как это сделать? Или это уже теоретически неправильно?

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Как насчет этого, чтобы начать.

alt text

EDIT

create table Content (
      ContentID   integer primary key
    , ContentType char(2)
    , ContentText text
) engine=InnoDb;

create table ScriptContent (
      ContentID integer primary key
    , URL       varchar(45)
    , Params    varchar(45)
) engine=InnoDb;
alter table ScriptContent add constraint fk1_ScriptContent foreign key (ContentID) references Content (ContentID);

create table ExternalProcess (
      ContentID integer primary key
    , SystemID  integer
    , ProcessID integer
) engine=InnoDb;
alter table ExternalProcess add constraint fk1_ExternalProcess foreign key (ContentID) references Content (ContentID);
0 голосов
/ 07 сентября 2010

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

Иметь таблицу страниц с идентификатором страницы и идентификатором содержимого. В разных таблицах может быть разное содержимое (по одному на каждый content_type_id), каждая таблица содержимого содержит столбец внешнего ключа page_id, указывающий на таблицу страниц. Недостатком может быть то, что вы не можете сделать одно объединение, чтобы вернуть содержимое для всех типов страниц, но вам придется создавать запросы SQL на основе различных значений поля page.content_type_id.

...