Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Выбор реализации много-ко-многим / 2 сообщений из 2, страница 1 из 1
16.06.2008, 10:13
    #35373919
sutni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор реализации много-ко-многим
День добрый.
Стою перед дилемой как реализовать на Cache структуру данных со связью много-ко-многим. Взять например накладную с перечнем товаров. Можно действовать классическим sql-подходом, и реализовать эту связь через дополнительный класс.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
//товар
Class MyProject.Good Extends %Persistent
{
Property NameRus As %String;
Property Price As %Float;

Relationship InvoiceItems As MyProject.InvoiceItem [ Cardinality = many, Inverse = MyGood];
}

//накладная
Class MyProject.Invoice Extends %Persistent
{
Property InvoiceDate As %TimeStamp;
Property Number As %String;

Relationship Items As MyProject.InvoiceItem [ Cardinality = many, Inverse = MyInvoice];

}

//позиция накладной
Class MyProject.InvoiceItem Extends %Persistent
{
//ссылка на товар
Relationship MyGood As MyProject.Good [ Cardinality = one, Inverse = InvoiceItems ];
//ссылка на накладную
Relationship MyInvoice As MyProject.Invoice [ Cardinality = one, Inverse = Items];
Property Count As %Integer;
}

Очень хочется упростить эту структуру и привести ее в более "объектно-ориентированный" вид. Кроме того, хочется уйти от объявления обратных ссылок, в таких классах, как Good. (В принципе, в этом примере можно использовать parent-child, но это принципиально ситуацию не меняет.)

Пробую делать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
//товар
Class MyProject.Good Extends %Persistent
{
Property NameRus As %String;
Property Price As %Float;
}

//накладная
Class MyProject.Invoice Extends %Persistent
{
Property InvoiceDate As %TimeStamp;
Property Number As %String;

//массив позиций
Property Items As list Of MyProject.InvoiceItem;
}

//позиция накладной
Class MyProject.InvoiceItem Extends %SerialObject
{
//ссылка на товар
Property Good As MyProject.Good;
Property Count As %Integer;
}

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

Если кто-то уже задавался подобными вопросами - поделитесь соображениями.
...
Рейтинг: 0 / 0
16.06.2008, 15:42
    #35374834
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор реализации много-ко-многим
Всегда многие-ко-многим делал через три таблицы с использованием связи один-ко-многим...
Типа:

ПредприятияКодНазвание
ГражданеКодФИО
Работники на предприятияхКод работникаКод предприятия
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Выбор реализации много-ко-многим / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]