Связи, построенные на собственных (кастомных) таблицах

Мы говорим о связях многие-ко-многим, для которых изначально предназначена таблица 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 определяются логикой связи. Например, от большего к меньшему, от главного к второстепенному или наоборот. В системе администрирования в зависимости от того, в качестве источника или приемника был определен класс документов, появится либо блок "Связи идущие к данному документу" (если документ является приемником) или "Связи идущие от данного документа" (если документ – источник для связей данного класса).

Практический пример. Расширение свойств SQL::DocumentTable
Документы, построенные на собственных (кастомных) таблицах
Связи, построенные на собственных (кастомных) таблицах
Дескриптор атрибутов объектов