Мы говорим о связях многие-ко-многим, для которых изначально предназначена таблица links:
create table links
(
id integer not null primary key default nextval('public.documents_id_seq'::text),
class text not null,
ctime timestamp not null default now(),
mtime timestamp not null default now(),
status smallint not null default 1,
source_id integer not null,
source_class text not null,
dest_id integer not null,
dest_class text not null,
data text
);
create index links_source on links (source_id);
create index links_dest on links (dest_id);
В данной таблице ничего лишнего – нет! Создавая кастомные таблицы связей, следует отталкиваться от формата таблицы links, расширяя ее необходимыми полями.
Вообще для среднестатистического проекта может оказаться достаточно возможностей одной единственной таблицы связей. Необходимость в дополнительных таблицах возникает при наличии действительно большого объема связей одного класса или при необходимости создать связи с дополнительными условиями. Тогда вы просто клонируете таблицу links, дополняете ее необходимыми полями и создаете дескриптор, наследуя его от SQL::LinkTable.
package myproject::SQL::TagCloudTable;
use strict;
use base 'SQL::LinkTable';
sub db_table
{
return 'tag_cloud';
}
# ----------------------------------------------------------------------------
# Свойства храним в массивах, потому что порядок важен!
# Это общие свойства - одинаковые для всех документов.
#
# attr - обязательный параметр, название атрибута;
# type - тип аттрибута, требуется для отображдения;
# rusname - русское название, опять же требуется для отображения;
# hidden - равен 1, когда
# readonly - инициализации при записи только без изменения в дальнейшем
# db_field - поле в таблице
# default - значение по умолчанию (поле всегда имеет это значение)
# ----------------------------------------------------------------------------
sub required_properties
{
my $self = shift;
my @parent_properties = $self->SUPER::required_properties;
return (
@parent_properties,
);
}
1;
Простое облако тегов.
Источники и приемники
Поскольку связи многие-ко-многим симметричны, то source_class и dest_class определяются логикой связи. Например, от большего к меньшему, от главного к второстепенному или наоборот. В системе администрирования в зависимости от того, в качестве источника или приемника был определен класс документов, появится либо блок "Связи идущие к данному документу" (если документ является приемником) или "Связи идущие от данного документа" (если документ – источник для связей данного класса).