:: Не фоксом единым
RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
* Связь таблиц двумя способами в FoxPro
*-----------------------------------------------
* Способ 1. Связь по индексированному полю в дочерней таблице
* Имеются две таблицы
CREATE CURSOR parent(kod i)
CREATE CURSOR child(kod i,name c(50))
* сначала индексируем child
SELECT child
INDEX ON kod TO idx
* затем устанавливаем RELATION с parent на child
SELECT parent
SET RELATION TO kod INTO child
*
*-----------------------------------------------
* Способ 2. Связь по RECNO() в дочерней таблице. Экономичный и возможно более скоростной.
* Устраняет избыточность первого способа.
* Та же суть, только связь будет не как выше по child.kod, а по child->RECNO()
* Имеются две таблицы
CREATE CURSOR parent(kod i)
CREATE CURSOR child(name c(50)) && Поле kod отсутствует !
* Индексировать child не нужно !
SELECT parent
SET RELATION TO kod INTO child

В С# первый способ обеспечит DataSet для двух DataTable.
A возможна ли там реализация второго способа ?
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
GotFocus
A возможна ли там реализация второго способа ?

Если твой child реализует интерфейс IList - то у него есть доступ по индексу - чем не recno()?
Исходя из того, что ты описал в вопросе - получится только абстрактный пример:
dynamic[] parent_cursor = new dynamic[]{
new {kod = 2},
new {kod = 1},
new {kod = 0},
new {kod = 4},
new {kod = 3}
};
dynamic[] child_cursor = new dynamic[]{
new {name = "Child 0"},
new {name = "Child 1"},
new {name = "Child 2"},
new {name = "Child 3"},
new {name = "Child 4"}
};
Func<dynamic, dynamic> relation = (parent_rec => child_cursor[parent_rec.kod]);
foreach (var parent in parent_cursor)
{
var child = relation(parent);
Console.WriteLine(child.name);
}
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
за "второй способ" нужно руки автору отрывать. Кроме того, датасет идеологически существенно отличается от фоксовых таблиц, неважно связанных или нет. Писать на дотнете используя фоксовые привычки по меньшей мере неразумно.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Роме спасибо за пример.

Igor Korolyov, прошу Вас пояснить, чем Вам не нравится второй способ.
Я его 15 лет использую и считаю предпочтительным - то же самое,что и первый,
а дочерняя таблица меньше по размеру. И индекс не нужен.



Исправлено 2 раз(а). Последнее : GotFocus, 12.12.10 19:03
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
для языка программирования низкого уровня (типа Си) и для манипулирования массивами (как в примере Романа) это нормально. Для любой реляционной СУБД это по меньшей мере неадекватно (противоречит самой сущности и основам реляционной модели). "номер записи" это особенность физической реализации СУБД, при том во многих СУБД её либо нет вовсе, либо она является непостоянной (в том же фоксе номер записи вполне себе меняется при упаковке таблицы).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
1.Упаковка таблицы(имеется ввиду PACK) самопроизвольно не происходит,
а вызывать её разумеется, нельзя.
2. Поле kod в примере, содержит числа. Зачем использовать эти числа,
когда можно использовать вместо этих чисел номера записей. Сколько сейчас
лишних байтов в таблицах .dbf, организованных по первому способу программистами,
непонятно зачем строго придерживавшихся сущности и основ реляционной модели.
3. Да, меня интересуют вопросы физической реализации СУБД. Вы хотели, что бы ознакомившись с основами реляционной модели, я не использовал более оптимальный путь?
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
Serj

Сообщений: 335
Откуда: Новосибирск
Дата регистрации: 12.07.2005
Понимаете, можно выражаться по русски, а можно на "падонкафском" сленге.
Можно программировать, применяя общепринятые правила, а можно изобретать свои.
В первом случае вашу систему смогут поддерживать другие программисты, а
вот во втором она окажется несопровождаемой. Если ваша задача сделать себя незаменимым
программистом, применительно к своей программе, то тогда вы на правильном пути
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
1. Вы, а может быть многие другие, возможно, не знали о существовании данного правила.
И не я его ввёл, а его предоставил FoxPro.Я имею ввиду второй способ.
И он не так труден для понимания, что бы его не смогли поддерживать другие программисты.
Вас никто не заставляет использовать этот способ. Я же никогда не уйду от
оптимальности к общепринятости.
2. Замечу, что дискуссия отходит от темы. Мой вопрос касался C#.



Исправлено 2 раз(а). Последнее : GotFocus, 13.12.10 13:05
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Каждый волен надевать штаны через голову, при том другие вполне себе могут либо посмеяться над "оригиналом", либо из сочувствия помочь ему. Если же он упорствует в своих заблуждениях - ну что-ж, остаётся только умыть руки...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Сказанное Igor Korolyov`ым - не по теме. Отвечать не буду.
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
GotFocus
* Способ 2. Связь по RECNO() в дочерней таблице. Экономичный и возможно более скоростной.
* Устраняет избыточность первого способа.
* Та же суть, только связь будет не как выше по child.kod, а по child->RECNO()
* Имеются две таблицы
CREATE CURSOR parent(kod i)
CREATE CURSOR child(name c(50)) && Поле kod отсутствует !
* Индексировать child не нужно !
SELECT parent
SET RELATION TO kod INTO child

В С# первый способ обеспечит DataSet для двух DataTable.
A возможна ли там реализация второго способа ?

Вы строите просто связь для отображения данных или же Вы таким образом пытаетесь создать правила ссылочной целостности БД?

Если первое, то можно применить такой приём при определенных условиях (хотя как ребята уже сказали он не правильный)

Если второе, то в фоксе можно такое реализовать, а вот в других СУБД такой фокус может уже не пройти.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Вот такой приём уже 15 лет успешно применяется мною, опровергая слова ребят
о его неправильности. Критерий истины - практика.

А вот что в других СУБД такой фокус может уже не пройти - это по теме.
Принимаю к сведению.
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
GotFocus
Вот такой приём уже 15 лет успешно применяется мною, опровергая слова ребят
о его неправильности. Критерий истины - практика.
...

Дело в том, что как только надо будет упаковать таблицу (либо будет достигнут предел в 2Г, либо повысить селективность индекса, итп... видать Вы ещё этих границ не достигли), то сразу ссылочная целостность отвалится,... те решать проблему с первичным и внешним ключем всё равно придётся - это только вопрос времени.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Повторюсь
Цитата:
1.Упаковка таблицы(имеется ввиду PACK) самопроизвольно не происходит,
а вызывать её разумеется, нельзя.
Новые записи пишутся на место удалённых, а если таких нет, добавляются новые
SET DELETED OFF
LOCATE ALL FOR DELETED()
IF FOUND()
REPLACE.....
ELSE
INSERT.....
ENDIF
SET DELETED ON

Случай с > 2 Гб не рассматривал. Если надо, займусь вечером.
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
GotFocus
Повторюсь
Цитата:
1.Упаковка таблицы(имеется ввиду PACK) самопроизвольно не происходит,
а вызывать её разумеется, нельзя.
Новые записи пишутся на место удалённых, а если таких нет, добавляются новые
SET DELETED OFF
LOCATE ALL FOR DELETED()
IF FOUND()
REPLACE.....
ELSE
INSERT.....
ENDIF
SET DELETED ON

Случай с > 2 Гб не рассматривал. Если надо, займусь вечером.

Хорошо, у меня вопрос: каким образом Вы добиваетесь ссылочной целостности БД, те с помощью каких средств?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Паш, ну что тут непонятного? С помощью своей памяти о том, что Pack делать нельзя.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Пожалуйста, поконкретней о предполагаемых моментах нарушения ссылочной целостности.
У меня не было нарушений ссылочной целостности, наверно что-то я предпринимал, а что, так сразу не вспомню.
Скажите, чего Вы опасаетесь в конкретном примере.
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Серёж, подожди, дай выяснить.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
GotFocus
Пожалуйста, поконкретней о предполагаемых моментах нарушения ссылочной целостности.
У меня не было нарушений ссылочной целостности, наверно что-то я предпринимал, а что, так сразу не вспомню.
Скажите, чего Вы опасаетесь в конкретном примере.

Например, у Вас есть документ (Накладная) она состоит из шапки (кому накладная) и содержания (что по ней отпустили, товар1/товар2/товар3), те есть две таблицы Шапка и Детали.

Теперь Вам надо удалить накладную (ну ошибся оператор), значит надо удалить одновременно и Шапку и Детали, если удалить Шапку, то останутся "подвисшие" Детали, вопрос мой заключался в том, как Вы удаляете данный документ и какой механизм используется, что бы было нельзя удалить Шапку без удаления Деталей?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: RELATION в FoxPro и в C#
GotFocus
Автор

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Периодически(период м. задать от 1 дня до 1 года) производится следующее:
1.
*--- Создаём таблицу с числом записей, как у справочника и
* ставим для каждой записи метку - "Запись нужно удалить"
CREATE CURSOR label(bool needDelete)
FOR i = 1 TO RECCOUNT('child')
INSERT INTO label(needDelete) VALUES(.T.)
ENDIF
*...
2. Проходим по всем таблицам, имеющим ключевое поле(в моём примере kod).
SELE parent && parent1, parent2, ...
SET Relation TO kod INTO label && И тут Relation вторым способом ! без индексов
SCAN
SELE label
REPLACE needDelete WITH .F. && На запись имеется ссылка - удалять нельзя
SELE parent
ENDSCAN
3. Теперь в дочерней таблице(справочнике) можно удалить записи, с которых
метка needDelete не снята
SELE label
SCAN
IF needDelete
childRecNo = RECNO()
SELE child
GO childRecNo
delete
Sele label
ENDIF
ENDSCAN
Страница кода (возможно в некоторых местах его нужно отладить)
и целостность обеспечена.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика