powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Медленная работа Select
9 сообщений из 34, страница 2 из 2
Медленная работа Select
    #33413903
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
ВладимирМБаза данных - это не просто набор таблиц, никак не связанных между собой. Это нечто, являющееся единым целым. Т.е., в общем случае, невозможно где-то, что-то подправить так, чтобы это не затронуло всего остального

С этим утверждением согласен, только до слов - "что-то где-то", для этого существует механизм ограничений (PK/FK/CK, CHECK, TRIGGER), если наши подправления нарушают эти ограничения, то вот это "что-то где-то" не пройдёт, а если пройдёт, то это сам понимаешь на чьи руки надо пенять. (не имею ввиду уважаемое собрание)

ВладимирМОтбрасывание ведущих пробелов в момент записи информации в таблицу (если этого не делать, то как раз и нужен индекс по AllTrim()) - это всего-лишь один из множества разнообразных контролей процесса записи информации.

Тогда обьясни как ты будешь отбрасывать ведущие пробелы для записей модифицируемых сторонним софтом на все CHAR поля писать RULE

Код: plaintext
CHECK IIF(ASC(MyField) =  32 ,.F.,.T.)

ВладимирМТо, что кто-то будет обращаться к таблицам напрямую и, предположительно, модифицировать данные, означает, что есть серьезный риск нарушить вообще всю целостность базы данных. Появление ведущих пробелов - будет всего-лишь признаком того, что кто-то влез в эту базу со стороны.

Надо ли это понимать, что НЕЛЬЗЯ использовать данные созданные в наших программах другим софтом, потому что другая прога не знает о наших допущениях (это мне напоминает фразу - если программа работает не так как надо, то отразим это в документации)

ВладимирМЕсть еще ряд проблем такого "стороннего" вмешательства. В общем случае, это не проблема автора программы, а проблема того, кто влез в базу данных используя сторонние программы.

У меня Дежа вю, какое-то на цитаты.

Ошибок не бывает вообще, есть ситуации для которых программист не предусмотрел проверки (с) Лес Пинтер

ВладимирМС другой стороны, наличие ведущих пробелов (если это не обусловлено спецификой данных) - это довольно значительная проблема организации поиска данных и неоправданное усложение программы. Т.е. использование индекса по AllTrim() - это признак "кривизны" контроля целостности базы данных.

Вот про кривизну контроля целостности по подробнее, если можно пример.
...
Рейтинг: 0 / 0
Медленная работа Select
    #33414307
S866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 PaulWist

Код: plaintext
Ошибок не бывает вообще, есть ситуации для которых программист не предусмотрел проверки (с) Лес Пинтер

Супер!
...
Рейтинг: 0 / 0
Медленная работа Select
    #33414672
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

Ну вообщем сам привожу примеры для разных случаев.

Код: 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.
* пример когда проходит занесение значащих значений при PADR()
CREATE CURSOR test (cText c( 5 ))
INDEX ON PADR(cText, 5 ) TAG cText candidat

INSERT INTO test (cText) VALUES ('1')
INSERT INTO test (cText) VALUES (SPACE( 1 ) + '1')

* Те же яйца только с ALLTRIM() - здесь уже нельзя добавить значащиеся символы
CREATE CURSOR testAll (cText c( 5 ))
INDEX ON ALLTRIM(cText) TAG cText candidat

INSERT INTO testAll (cText) VALUES ('1')
INSERT INTO testAll (cText) VALUES (' 1')

* Пример с "уборкой" пробелов
CREATE CURSOR testCheck (cText c( 5 ) CHECK SpaceFunc())
INDEX ON PADR(cText, 5 ) TAG cText candidat

INSERT INTO testCheck (cText) VALUES ('1')
INSERT INTO testCheck (cText) VALUES (' 1')

FUNCTION SpaceFunc

IF ASC(cText) =  32 
	replace cText with ALLTRIM(cText)
ENDIF 
ENDFUNC 

В любом случае есть ещё проблемы с SELECT-SQL, не зависимо от выражения индекса (PADR/ALLTRIM) в WHERE условии надо повторить этот синтаксис.

Ладно, оставим этот разговор, а то он у нас случается раз в полгода.

Хотя если у тебя есть пояснения готов выслушать с большим вниманием. :))
...
Рейтинг: 0 / 0
Медленная работа Select
    #33415048
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
С этим утверждением согласен, только до слов - "что-то где-то", для этого существует механизм ограничений (PK/FK/CK, CHECK, TRIGGER), если наши подправления нарушают эти ограничения, то вот это "что-то где-то" не пройдёт, а если пройдёт, то это сам понимаешь на чьи руки надо пенять. (не имею ввиду уважаемое собрание)
Это утверждение предполагает, что ВСЯ бизнеслогика, в том, что касается целостности базы данных, вынесена на уровень триггеров. Как минимум, в хранимые процедуры. В идеале так и должно быть. Но, как правило, от этого правила отступают. Слишком громоздко получается...

PaulWist
ВладимирМОтбрасывание ведущих пробелов в момент записи информации в таблицу (если этого не делать, то как раз и нужен индекс по AllTrim()) - это всего-лишь один из множества разнообразных контролей процесса записи информации.

Тогда обьясни как ты будешь отбрасывать ведущие пробелы для записей модифицируемых сторонним софтом на все CHAR поля писать RULE
Ну, это-то просто...

1) FORMAT="T" - в свойствах поля.

Поскольку эта настройка может быть перекрыта в формах, то добавляю безусловный контроль

2) RULE-уровня записи

Код: plaintext
REPLACE MyField WITH LTRIM(MyField)

PaulWist
ВладимирМТо, что кто-то будет обращаться к таблицам напрямую и, предположительно, модифицировать данные, означает, что есть серьезный риск нарушить вообще всю целостность базы данных. Появление ведущих пробелов - будет всего-лишь признаком того, что кто-то влез в эту базу со стороны.

Надо ли это понимать, что НЕЛЬЗЯ использовать данные созданные в наших программах другим софтом, потому что другая прога не знает о наших допущениях (это мне напоминает фразу - если программа работает не так как надо, то отразим это в документации)
Нельзя (по крайней мере очень не желательно) модифицировать данные при помощи другого софта. А использовать (в смысле на просмотр), конечно можно.

Ты рассмотрел только вопрос ведущих пробелов. А ведь вариантов модификации базы данных, когда это делается напрямую, минуя прогу, огромное количество. Далеко не все возможные проблемы можно решить через правила и тригера.

В "родной" программе огромное количество проблем просто не возникает из-за того, что у пользователя нет инструмента прямой модификации базы данных. Если это правило нарушается, то уровень сложности контроля целостности базы данных подскакивает до небес.

PaulWist
ВладимирМЕсть еще ряд проблем такого "стороннего" вмешательства. В общем случае, это не проблема автора программы, а проблема того, кто влез в базу данных используя сторонние программы.

У меня Дежа вю, какое-то на цитаты.

Ошибок не бывает вообще, есть ситуации для которых программист не предусмотрел проверки (с) Лес Пинтер
"И это правильно!" (с)

PaulWist
ВладимирМС другой стороны, наличие ведущих пробелов (если это не обусловлено спецификой данных) - это довольно значительная проблема организации поиска данных и неоправданное усложение программы. Т.е. использование индекса по AllTrim() - это признак "кривизны" контроля целостности базы данных.

Вот про кривизну контроля целостности по подробнее, если можно пример.
Индекс по AllTrim() - это предположение, что данные не корректны! Их нельзя использовать напрямую. Без предварительного преобразования. Тогда встает вопрос почему только AllTrim(). А где UPPER(), а где CHRTRAN() для отсечения "лишних" символов? Почему только ведущие пробелы? А если пробел в середине слова? И т.д. и т.п.

Если для работы с данными требуется их преобразование в обязательном порядке , то возникает серьезное сомнение в достоверности самих данных.
...
Рейтинг: 0 / 0
Медленная работа Select
    #33415107
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я, вообще-то, не пускаю сторонние программы напрямую работать с таблицами собственно моей БД. Только через специальные интерфейсные таблицы ввода-вывода, причем ввод - только с проверками.
...
Рейтинг: 0 / 0
Медленная работа Select
    #33417057
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ PaulWist

С этим утверждением согласен, только до слов - "что-то где-то", для этого существует механизм ограничений (PK/FK/CK, CHECK, TRIGGER), если наши подправления нарушают эти ограничения, то вот это "что-то где-то" не пройдёт, а если пройдёт, то это сам понимаешь на чьи руки надо пенять. (не имею ввиду уважаемое собрание)

Это утверждение предполагает, что ВСЯ бизнеслогика, в том, что касается целостности базы данных, вынесена на уровень триггеров. Как минимум, в хранимые процедуры. В идеале так и должно быть. Но, как правило, от этого правила отступают. Слишком громоздко получается...

Я бы разделил бизнес логику на две составляющих

1. Поддержание ссылочной целостности (PK/FK), ограничений (CK/RULE)
2. Собственно занесение/модификация данных

Так вот думаю, что определение ссылочной целостности и правил должно быть вседа, иначе - это не база данных, а просто набор таблиц.

Теперь по модификации данных - согласен, что в большинстве случаев мы в коде приложения получаем PK для Мастер-таблицы и ручками его прописываем в Детали-таблицу, но это идеологически не правильно и я прекрасно понимаю, что такие наши действия - это наследие FPD.

Поэтому если отбросить п.2, то ничего сложного для поддержания БД мне кажется нет.

ВладимирМНу, это-то просто...

1) FORMAT="T" - в свойствах поля.

Поскольку эта настройка может быть перекрыта в формах, то добавляю безусловный контроль

2) RULE-уровня записи

Принято.

ВладимирМНельзя (по крайней мере очень не желательно) модифицировать данные при помощи другого софта. А использовать (в смысле на просмотр), конечно можно.

Конечно имелось в виду, модифицировать. Даже не знаю, что сказать.

Приведу пример - у Вас есть некий купленный софт, который что-то делает, у этого софта есть справочники. Предположим, что мы написали программу использующую справочники этого стороннего софта (ну не вести же, те же справочники ещё в одном месте).

Пользователи тебе говорят, слушай мы работаем в твоей проге и время от времени надо, например в справочниках стороннего софта(или в документах), что-то править, ну не удобно нам переключаться из одного в другое, сделай так что бы мы могли из твоей программы модифицировать данные в стороннем софте.
Каков будет твой ответ - нет ребята нельзя или да запросто, только разберусь со структурой данных, думаю второе.
Таким образом мы убиваем несколько зайцев и главный из них - это создание корпоративной БД, а не набор проектов реализующий ту или иную функциональность.

ВладимирМТы рассмотрел только вопрос ведущих пробелов. А ведь вариантов модификации базы данных, когда это делается напрямую, минуя прогу, огромное количество. Далеко не все возможные проблемы можно решить через правила и тригера

ВладимирМИндекс по AllTrim() - это предположение, что данные не корректны! Их нельзя использовать напрямую. Без предварительного преобразования. Тогда встает вопрос почему только AllTrim().

Отвечу твоей же цитатой, которую мы приняли

ВладимирМС другой стороны, наличие ведущих пробелов ( если это не обусловлено спецификой данных )

Те, другими словами нас не интересуют пробелы, а интересуют значащие символы отличные от пробелов.

Владимир, напомню с чего началось

ВладимирМНе совсем. Такой индекс эквивалентен отбрасыванию ведущих пробелов.

Т.е. конструкция допустима, но FoxPro сам, автоматически, после отсечения ведущих и концевых пробелов добавит концевые пробелы в выражение ключа до количества символов в поле sh.

Идеологически, да, неверно .

Из этого следует, что использование ALLTRIM() идеологически неверно, а
PADR() определялось как правильное решение (таких слов от тебя не было написано, но и о том, что PADR() или др ф-ию не хорошо использовать тоже не прозвучало ).

ВладимирМЕсли для работы с данными требуется их преобразование в обязательном порядке, то возникает серьезное сомнение в достоверности самих данных.

Ну, думаю ты здесь малёк переборщил - данные они и есть данные, независимо надо их преобразовывать или нет - это как обьективная реальность данная нам в ощущения. А то что мы их можем преобразовать на этапе модификации или на этапе использования - это зависит, как правило от задачи, а не от данных.
...
Рейтинг: 0 / 0
Медленная работа Select
    #33418158
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistПользователи тебе говорят, слушай мы работаем в твоей проге и время от времени надо, например в справочниках стороннего софта(или в документах), что-то править, ну не удобно нам переключаться из одного в другое, сделай так что бы мы могли из твоей программы модифицировать данные в стороннем софте.
Каков будет твой ответ - нет ребята нельзя или да запросто, только разберусь со структурой данных , думаю второе.
Ключевой момент - это именно разбор структуры данных. Сам понимаешь, что просто так взять и вставить куда-то данные нельзя. Надо проследить всю цепочку взаимодействий и убедиться, что твоя модификация не повредит целостности базы данных.

Т.е. ты сам предполагаешь, что не весь контроль ссылочной целостности вынесен в триггера и правила. Что-то, где-то не учли (специально или случайно - другой вопрос)

PaulWistТаким образом мы убиваем несколько зайцев и главный из них - это создание корпоративной БД, а не набор проектов реализующий ту или иную функциональность.
Теоретически. Практически, такая конструкция долго не живет. Это кончается либо приобритением, либо написанием единой ERP-системы. Слишком тяжело сопровождать систему слепленную из массы разнородных модулей.

PaulWistВладимир, напомню с чего началось

ВладимирМНе совсем. Такой индекс эквивалентен отбрасыванию ведущих пробелов.

Т.е. конструкция допустима, но FoxPro сам, автоматически, после отсечения ведущих и концевых пробелов добавит концевые пробелы в выражение ключа до количества символов в поле sh.

Идеологически, да, неверно .

Из этого следует, что использование ALLTRIM() идеологически неверно, а
PADR() определялось как правильное решение (таких слов от тебя не было написано, но и о том, что PADR() или др ф-ию не хорошо использовать тоже не прозвучало ).
На самом деле началось чуть раньше. В исходном запросе конструкция с AllTrim() явно использовалась для связки PK-FK. Это идеолгоически неверно при любом раскладе. PK вообще не должен никак преобразовываться. На то он и PK. Индекс по PK - это всего-лишь инструмент ускорения поиска нужного значения.

Идеологически верно, с моей точки зрения, это контролировать модификацию данных так, чтобы вообще не возникало необходимости в отсечении ведущих пробелов. Опять же, если это не обусловлено самими данными. Но, поскольку в данном примере речь идет о PK-FK, то данными это не может быть никак обусловлено.

Под фразой "обусловлено самими данными" я понимаю то, что ведущие пробелы - это некие значимые символы. Т.е. не просто "рука дрогнула", а именно что необходимы ведущие пробелы.

PaulWist
ВладимирМЕсли для работы с данными требуется их преобразование в обязательном порядке, то возникает серьезное сомнение в достоверности самих данных.

Ну, думаю ты здесь малёк переборщил - данные они и есть данные, независимо надо их преобразовывать или нет - это как обьективная реальность данная нам в ощущения. А то что мы их можем преобразовать на этапе модификации или на этапе использования - это зависит, как правило от задачи, а не от данных.
Да. Согласен. Если говорить "вообще". Просто я опять высказался в контексте данного вопроса, когда преобразование использовалось для связки PK-FK в данной постановке . В данной задаче - это недоработка разработчика.
...
Рейтинг: 0 / 0
Медленная работа Select
    #33418717
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМКлючевой момент - это именно разбор структуры данных. Сам понимаешь, что просто так взять и вставить куда-то данные нельзя. Надо проследить всю цепочку взаимодействий и убедиться, что твоя модификация не повредит целостности базы данных.

Т.е. ты сам предполагаешь, что не весь контроль ссылочной целостности вынесен в триггера и правила. Что-то, где-то не учли (специально или случайно - другой вопрос)

Да, конечно, при разнородных источниках данных просто невозможно используя внутренние механизмы Fox-a поддерживать ссылочную целостность, для этого приходится использовать либо собственное творчество реализованное в триггерах, либо софт стороннего производителя, но это не значит, что этого не надо делать. Да это трудоёмко и на первый взгляд не очевидно, но в дальнейшем решает массу проблем.

ВладимирМ PaulWistТаким образом мы убиваем несколько зайцев и главный из них - это создание корпоративной БД, а не набор проектов реализующий ту или иную функциональность.

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

У меня мнение другое, с точностью до наоборот. Теоретически, хорошо бы иметь одну систему, а практически это не реально, первый аргумент - это мнение генерала, который говорит - "я и так затратил кучу денег, а ты мне предлагаешь опять раскошелиться", а второй аргумент - ну купили ERP - систему, через какое-то время возникает необходимость в CRM системе, причем разработка её под ERP составит круглую сумму, а покупка готового решения даже с доделками/настройками обойдется 1000-2000$ на рабочее место. Через какое-то время выяснится, что ещё что-то нужно, и сам понимаешь колробочный софт будет на порядок дешевле разработки.

Где-то года два назад, я у себя в конторе пытался подсчитать - какое кол-во прикладного софта используется - когда дошел до цифры в 80 программ, бросил.
Это я к чему ни одна система не может обеспечит всего функционала хозяйственной деятельности предприятия, да ещё если оно развивается.

Ну давай вернемся к нашим баранам, а то действительно понесло в философию.

ВладимирМ В исходном запросе конструкция с AllTrim() явно использовалась для связки PK-FK. Это идеолгоически неверно при любом раскладе. PK вообще не должен никак преобразовываться. На то он и PK.

Что ж, в данном конкретном случае когда простой тэг по полю является PK, преобразование поля через ф-ию излишне (в том случае если мы позаботились об отсечении пробелов), но сам понимаешь тэг PK может быть составным и без ф-ий здесь никак не обойтись, можно возразить - вот именно здесь проявляется "кривизна" данных, отвечу не всегда, поэтому, поскольку наши посты читают другие ребята, отметим этот аспект, а то у них может сложиться привратное впечатление.

ВладимирМИндекс по PK - это всего-лишь инструмент ускорения поиска нужного значения.

Думаю, здесь ты не дописал, что ускорение поиска это побочный (хотя не мало важный) эффект, а основное его предназначение создание не протеворечивости данных, поскольку вряд ли PK может участвовать в задании критерия поиска.

ВладимирМИдеологически верно, с моей точки зрения, это контролировать модификацию данных так, чтобы вообще не возникало необходимости в отсечении ведущих пробелов. Опять же, если это не обусловлено самими данными.

Давай вернемся к FORMAT = "T"

Что-то я засомневался в таком подходе отсечения ведущих пробелов.

Проверим.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE DATABASE TestChar

CREATE TABLE TestCh (ID c( 10 ) NOT NULL, PRIMARY KEY ID TAG ID)

DBSETPROP('TESTCH.ID', 'Field', 'Format', "T")

INSERT INTO testCh (ID) VALUES ('1')
INSERT INTO testCh (ID) VALUES (SPACE( 1 ) + '1')
INSERT INTO testCh (ID) VALUES (SPACE( 2 ) + '1')

BROWSE LAST

Пожалуй, только RULE остается.
...
Рейтинг: 0 / 0
Медленная работа Select
    #33419025
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет Format = "T".

Эта штука работает только при "ручном" вводе данных. Т.е. при программном вводе - игнорируется. Однако это уже проблемы программста, почему он при программном вводе не озаботился отсечением ведущих пробелов.

Кроме того, эта настройка может быть перекрыта настройками в объектах формы. Т.е. если в настройках TextBox, у которого в качестве ControlSource указано такое поле просто очистить настройку Format, то она действительно не будет использоваться в данном объекте. Но это опять вопрос к программисту - а зачем ты это сделал?

RULE- действительно надежно. Но опять же - это избыточная настройка, если предполагается, что работа будет вестись только из данной проги.

Совместимость разнородного софта - это огромная проблема. Но это тема отдельного разговора.

PS: я бы тут еще порассуждал на отвелеченные темы, но времени маловато. Иногда и работать надо
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Медленная работа Select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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