Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2015.02.15;
Скачать: [xml.tar.bz2];

Вниз

Нужны идеи.   Найти похожие ветки 

 
Юрий Зотов ©   (2014-07-14 21:27) [0]

Есть БД, в ней данные о людях. Обязательные поля - ФИО, пол, дата рождения. Необязательные поля (т.е. могут быть пустыми) - серия и номер паспорта. Таких записей - десятки миллионов.

Вводится документ, в нем те же поля. Требуется проверить, есть ли такой человек в БД и в зависимости от результатов проверки отнести вводимый документ к одной из трех групп:
А). найден с полным соответствием полей;
Б). найден с неполным соответствием полей;
В). не найден.

Планирую сделать так. В коде конструируем select по всем заполненным полям документа. Если этот select пустой, то имеем случай B, если дает одного человека, то это случай А, если дает несколько человек, то это случай Б.

Что смущает. Допустим, select пришел пустым. Вроде как, это случай В. Но при этом не совпало лишь какое-то одно поле (например, указан ошибочный номер паспорта) - тогда это случай Б. И поскольку мы не знаем сколько полей не совпало, мы не можем решить, в какую группу надо этот документ относить.

Решение "в лоб" - делать отдельные select"ы по каждому заполненному полю и на клиенте анализировать совпадение каждого поля. Но это не годится - слишком долго, да и выборки будут огромными.

В общем, нужны идеи. Заранее спасибо.


 
turbouser ©   (2014-07-14 21:34) [1]


> В коде конструируем select

Это неправильный подход. К сожалению, СУБД не озвучена, но скорее всего одна из тех, в которых можно реализовать ХП.
т.е. все сводится к созданию процедуры, входные параметры - фио, др, данные паспорта и все остальное. И уже в ней select -ы. Точнее даже EXISTS-ы :)


 
это все...   (2014-07-14 21:36) [2]

на первом шаге sql запрос по мандатори полям оунли.
результат  в xml
второй шаг - selectNodes c xpath по вариациям опциональных полей.


 
это все...   (2014-07-14 21:38) [3]

т.е. все сводится к созданию процедуры,

проще простой селект где все условия по кейсу в котором на выборку влияют только не нулл параметры.

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

и процедура здесь ничем не поможет


 
Inovet ©   (2014-07-14 21:39) [4]

> [0] Юрий Зотов ©   (14.07.14 21:27)
> Но при этом не совпало лишь какое-то одно поле (например,
> указан ошибочный номер паспорта)

Г) Указан чужой номер паспорта


 
turbouser ©   (2014-07-14 21:42) [5]


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

тут важный момент -
>  Но при этом не совпало лишь какое-то одно поле

Набор полей ограничен, и на EXISTS проверить просто

> и процедура здесь ничем не поможет

Очень даже поможет. Вместо того, что бы динамически городить уйму select-ов, все можно сделать в одной ХП.


 
это все...   (2014-07-14 21:45) [6]

Вместо того, что бы динамически городить

а никто кроме тебя городить динамический sql и не будет.

будет sql сделанный в дизайнтайм.
но все условия будут по кейсу.
что введено  - повлияет на выборку.
что не введено - никак не повлияет на выборку.

и процедура здесь нафик не нужна.


 
turbouser ©   (2014-07-14 21:46) [7]


> это все...   (14.07.14 21:38) [3]


> проще простой селект где все условия по кейсу

при условии, что
>  Таких записей - десятки миллионов

Надо курить план. Скорее всего кейс будет неэффективен


 
turbouser ©   (2014-07-14 21:49) [8]


> это все...   (14.07.14 21:45) [6]


> а никто кроме тебя городить динамический sql и не будет.

А как же безопасность? :) А если надо что-то в этом коде срочно, прямо внезапно поменять?


 
это все...   (2014-07-14 21:51) [9]

при условии, что
>  Таких записей - десятки миллионов


боюсь-боюсь.

PS в прошлом году решил похожую задачу.
тоже десятки миллионов.
но только серверов было больше десяти и на каждом по три схемы.
а искать надо было из одной точки, нажатием одной кнопки.


 
jack128_   (2014-07-14 21:52) [10]

Чем такой код не устраивает:
select First 1
 ID, FirstName, LastName, .... ,
 (LastName = :LastName) as LastNameFlag,
 (FirstName= :FirstName) as FirstNameFlag,
  .....
from People
where LastNameFlag or FirstNameFlag or .... (остальные флаги)
order by LastNameFlag + FirstNameFlag + (остальные флаги) desc

// так как БД не озвучена, то предпологаю, что там есть поддержка boolean и неявное преобразование из boolean в int (false = 0, true = 1)

Если все поля XXXFlag = True, то это вариант А)
Если одно из полей XXXFlag = False, то это вариант Б) какие именно поля не совпадают можно по значениям флагов понять.
Если выборка пустая, то В)


 
Омлет ©   (2014-07-14 21:52) [11]

Как-то так:


SELECT COALESCE(
 SELECT "full" WHERE EXISTS(SELECT * FROM t WHERE fio=? AND sex=? AND birthDate=? and seria=? and number=?),
 SELECT "partially" WHERE EXISTS(SELECT * FROM t WHERE (fio=? and birthDate=?) or (seria = ? and number=?)),
 "nothing"
)


 
это все...   (2014-07-14 21:53) [12]

А как же безопасность? :)

в смысле безопасность?


 
turbouser ©   (2014-07-14 21:54) [13]


> это все...   (14.07.14 21:53) [12]
>
> А как же безопасность? :)
>
> в смысле безопасность?

SQL injection например


 
это все...   (2014-07-14 21:56) [14]

а дофига ли ты въинъектишь небезопасности в параметры?


 
turbouser ©   (2014-07-14 21:58) [15]


> это все...   (14.07.14 21:56) [14]
>
> а дофига ли ты въинъектишь небезопасности в параметры?

%


 
turbouser ©   (2014-07-14 21:59) [16]

И вообще, если весь SQL генерируется динамически - просто сказка


 
это все...   (2014-07-14 22:00) [17]

процент вдруг стал инъекцией?

чего только не узнаешь в потрепаться


 
turbouser ©   (2014-07-14 22:02) [18]


>  это все...   (14.07.14 22:00) [17]
>
> процент вдруг стал инъекцией?
>
> чего только не узнаешь в потрепаться

Ну сольют у тебя всю базу с фио и паспортами, ничего, не инъекция ни разу:)


 
это все...   (2014-07-14 22:02) [19]

И вообще, если весь SQL генерируется динамически - просто сказка

знаешь, серверу как то пофик на то что ему сгенерили sql за полсекунды до отправки запроса.

он твоих восторгов не разделяэ. ему по барабану.


 
это все...   (2014-07-14 22:03) [20]

Ну сольют у тебя всю базу с фио и паспортами, ничего, не инъекция ни разу:)

даже если сольют, то при чем здесь иньекция

слово нравится?


 
Омлет ©   (2014-07-14 22:04) [21]

> turbouser ©

Как связаны динамическое формирование sql и безопасность?
Не пори чушь.


 
turbouser ©   (2014-07-14 22:04) [22]


> это все...


> даже если сольют, то при чем здесь иньекция
>
> слово нравится?

Хм. Все понятно.


 
это все...   (2014-07-14 22:06) [23]

Хм. Все понятно.

Вот тут ты прав. Все понятно стало уже постов десять как.


 
turbouser ©   (2014-07-14 22:06) [24]


> Омлет ©   (14.07.14 22:04) [21]
>
> > turbouser ©
>
> Как связаны динамическое формирование sql и безопасность?
>
> Не пори чушь.

В чем именно чушь?


 
turbouser ©   (2014-07-14 22:17) [25]


> Омлет ©   (14.07.14 22:04) [21]

Ты считаешь, что если можно узнать имя таблиц и сделать из них SELECT * это в принципе ерунда, не стоит внимания, и к безопасности отношения никакого не имеет?

> это все...   (14.07.14 22:06) [23]
>
> Хм. Все понятно.
>
> Вот тут ты прав. Все понятно стало уже постов десять как.
>

Удачи :)


 
это все...   (2014-07-14 22:19) [26]

Ты считаешь, что если можно узнать имя таблиц и сделать из них SELECT *

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


 
Омлет ©   (2014-07-14 22:21) [27]

> turbouser ©   (14.07.14 22:17) [25]

Хватит позориться.
Иди уже почитай про подстановку параметров в запросы.


 
turbouser ©   (2014-07-14 23:00) [28]


>  Омлет ©   (14.07.14 22:21) [27]
>
> > turbouser ©   (14.07.14 22:17) [25]
>
> Хватит позориться.
> Иди уже почитай про подстановку параметров в запросы.


>  это все...   (14.07.14 22:19) [26]
>
> Ты считаешь, что если можно узнать имя таблиц и сделать
> из них SELECT *
>
> я тебе все имена всех таблиц расскажу.
> а ты через параметры моего запроса сделай из них селект.
>
> и пока не сделаешь не приходи.


Речь не про подстановку в параметры. Так что не в кассу.


 
й   (2014-07-14 23:19) [29]

ничего "хитрого" не придумывается
тупо: 1) селект по всем (N) заполненным полям (на полное совпадение)
кстати, если он вдруг дает несколько человек, то это вроде как не "Б) найден с неполным соответствием полей", а вовсе даже заполнено слишком мало полей, чтобы определить однозначное соответствие, то есть любое совпадение по этому набору полей с большой вероятностью будет ложным!
2) N селектов по N-1 полю (по очереди исключаем каждое) - на неполное совпадение по всем полям кроме одного
3) дофига селектов по N-2 полям, возможно, еще N-3 и т.д. (нужны явно не все возможные комбинации, например, только ФИО, ФИ+дата, ИО+дата скорее нужны, только имя+дата+пол - скорее нет)
Что смущает: нет критерия, что такое "найден с неполным соответствием полей" - если ФИО совпало, а остальное нет - это как, "найден"?
а если только серия и номер? серия, номер и имя? номер и фамилия?
да и критерий "полное совпадение" неясен - это все 7 полей? только 5 обязательных? все заполненные именно во 2 документе поля (от 5 до 7)?

хотя можно еще сделать процедуру, подсчитывающую для каждой записи число полей, совпадающих в ней с образцами-параметрами (f,i,o,sex,date,ser,num) и выдающую те записи, для которых это число больше определенного значения (и ORDER DESC по нему же) - но это только полный проход по таблице, а селекты будут индексы использовать


 
это все...   (2014-07-14 23:30) [30]

Речь не про подстановку в параметры. Так что не в кассу.

Деточка, тебе уже сказали, что кроме параметров в запросе ничего не меняется. А сам запрос в дизайне определен.
А ты все боянишь про свой "сказочный динамический эскуэль"


 
turbouser ©   (2014-07-15 00:00) [31]


>  это все...   (14.07.14 23:30) [30]
>
> Речь не про подстановку в параметры. Так что не в кассу.
>
>
> Деточка, тебе уже сказали, что кроме параметров в запросе
> ничего не меняется. А сам запрос в дизайне определен.
> А ты все боянишь про свой "сказочный динамический эскуэль"

То есть, добавить к твоему в дизайне определенному запросу свои команды это из разряда фантастики?


 
это все...   (2014-07-15 00:15) [32]

Удалено модератором
Примечание: Отдохни немного


 
OOO   (2014-07-15 06:19) [33]

А никого не смутило, что есть база людей с ФИО, паспортными данными и другой информацией на несколько десятков миллионов человек (140?)?


 
ВладОшин ©   (2014-07-15 09:14) [34]

с первой страницы любой запрос по not null и null полям. Главное, имхо, план курить и индексы при возможности правильные навесить.


> никого не смутило, что есть база людей с ФИО, паспортными
> данными и другой информацией

нет. По двум причинам:
1. сколько таковых прошло через руки совершенно легально..
2. ЮЗ ерундой не занимается


 
ВладОшин ©   (2014-07-15 09:27) [35]

плохо что паспотр nullable
может, сделать его по дефолту to_number(GUID) и объявить уникальным ключом, задающим порядок хранения(mssql:кластерный)? По идее, паспорт обязан быть уникальным + второй запрос по №паспорта будет гораздо быстрее.

И с него начинать.

Омлет ©   (14.07.14 21:52) [11]
Как-то так:
SELECT COALESCE(
SELECT "full"  WHERE EXISTS(SELECT * FROM t WHERE (seria + number=?)) --п ервым делом
..


 
имя   (2014-07-15 09:29) [36]

Удалено модератором


 
KSergey ©   (2014-07-15 09:55) [37]

Б). найден с неполным соответствием полей;

Тут хорошо бы уточнить что это за "неполное соответствие", какие именно поля могут не совпасть, чтобы выдать такой диагноз, а не вариант В)
Маша Игоревна Петрова и Маша Сигизмундовна Петрова - это неполное соответствие? не понятно.
А Маша Сегизмундовна Питрова - это что?


 
Юрий Зотов ©   (2014-07-15 10:03) [38]

> OOO   (15.07.14 06:19) [33]

> А никого не смутило, что есть база людей с ФИО, паспортными данными и
> другой информацией на несколько десятков миллионов человек?


Ну да, такая база есть. А Вы разве об этом не догадывались? Или Вы думаете, что документы по всяким там пенсионным делам обрабатываются вручную?

> Пит   (15.07.14 09:29) [36]

> дядя Юра за нами следит


Конечно. Причем очень внимательно. Читаю и прикидываю "боевую" реализацию. Задать вопрос и забыть о нем - это было бы свинством.


 
имя   (2014-07-15 10:09) [39]

Удалено модератором


 
Юрий Зотов ©   (2014-07-15 10:11) [40]

> KSergey ©   (15.07.14 09:55) [37]

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


Именно. Первоначально ответ на этот вопрос должен дать человек. Чем сейчас и занимаюсь.

> А Маша Сегизмундовна Питрова - это что?

Либо "не найден", либо "частично совпал". Я уже думал о том, чтобы прикрутить SOUNDEX или что-то в этом духе. Но и этот ответ сначала должен дать человек.


 
Inovet ©   (2014-07-15 10:13) [41]

У пенсионного СНИЛС с контрольной суммой, так и то исхитряются чужой внести.


 
KSergey ©   (2014-07-15 10:18) [42]

> Юрий Зотов ©   (15.07.14 10:11) [40]
> Но  и этот ответ сначала должен дать человек.

Какой человек??


 
эта пять   (2014-07-15 10:20) [43]

если взять базу из всего населения глобуса и сделать селект по фио полу и дате рождения то в выборке ну никак не будет даже миллиона
ну сто тысяч согласен будет. может быть.
и для средней офисной тачки это не объем.

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

вопрос можно мусолить еще две недели, а у меня это год как работает по 72 однородным схемам (14 серверов по 3 схемы на каждом)
причем работает так, что ни у кого не возникает желания сделать это еще быстрее.


 
Юрий Зотов ©   (2014-07-15 11:39) [44]

Народ, покритикуйте.

Суть:
- совпадение всех 7 полей считаем полным;
- совпадение всех 5 обязательных полей при несовпадении серии или номера паспорта  считаем неполным;
- несовпадение хотя бы одного из 5 обязательных полей считаем "не найден".

select серия_паспорта, номер_паспорта
from ...
where <5 обязательных полей> // будет не более 3000 записей.


Если запрос пустой то "не найден".

Если запрос не пустой, то в цикле проверяем серию и номер:
- если они хоть раз совпали, то полное соответствие;
- если не совпали ни разу, то неполное соответствие.


 
Inovet ©   (2014-07-15 12:03) [45]

Зачем разделять серию и номер?


 
Юрий Зотов ©   (2014-07-15 12:10) [46]

> Inovet ©   (15.07.14 12:03) [45]

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


 
Inovet ©   (2014-07-15 12:15) [47]

> [46] Юрий Зотов ©   (15.07.14 12:10)

Не надо ничего отсекать. Смысла хранить серию отдельно от номера не вижу. Надо хранить код документа и серию-номер в таком виде, как они указаны в документе, который, как ты правильно сказал, бывает не только паспортом гражданина РФ и не только паспортом вообще.

Но это так в сторону слегка по поводу лишних сущностей.


 
ВладОшин ©   (2014-07-15 12:20) [48]


> Народ, покритикуйте.

> в цикле

ps
СУБД то секретная что ли? :)


 
Юрий Зотов ©   (2014-07-15 12:24) [49]

> Inovet ©   (15.07.14 12:15) [47]
> Надо хранить код документа и серию-номер в таком виде, как они указаны
> в документе


Да я-то не против, я только "за". Но объясни это той девочке-операторше, которая сегодня поругалась с парнем и вводит номер 000123 как 123, а завтра с парнем помирилась и вводит номер 000123 полностью.

И таких девочек - полстраны.
:o)

PS
Что, в общем-то, и неплохо.


 
Юрий Зотов ©   (2014-07-15 12:29) [50]

> ВладОшин ©   (15.07.14 12:20) [48]
> в цикле


Ну да, в цикле по набору данных (while next). Запрос вернет 2-3 тыс. записей, одна из которых - искомая. Как только ее нашли - стоп, а если ее нет, то цикл дойдет до конца. И что тут страшного?


 
Inovet ©   (2014-07-15 12:40) [51]

> [49] Юрий Зотов ©   (15.07.14 12:24)

Не давать вводить такое, коду документа соответсвует шаблон номера документа. А то девочка может много чего ввести, может парень у неё араб, а серия буквенная, и введет она вместо "АБВ" "ВБА"


 
имя   (2014-07-15 12:54) [52]

Удалено модератором


 
Юрий Зотов ©   (2014-07-15 13:10) [53]

Удалено модератором


 
ВладОшин ©   (2014-07-15 13:19) [54]


> эта пять   (15.07.14 12:54) [52]

ну да, лучше в дом 100 000 засунуть :)


> Юрий Зотов ©

ну.. 3000 перебирать..
может, все-таки хранимка?

select серия_паспорта, номер_паспорта
into #TEMP
from ...
where <5 обязательных полей> // будет не более 3000 записей.

select @RSLT1 = count(*) from #TEMP

select @RSLT2 = count(*)
from #TEMP
where  2_необязательных поля

return @RSLT1 , @RSLT2


 
имя   (2014-07-15 13:22) [55]

Удалено модератором


 
имя   (2014-07-15 13:24) [56]

Удалено модератором


 
эта пять   (2014-07-15 13:30) [57]

ну да, лучше в дом 100 000 засунуть :)

разумеется лучше!

И ровно настолько, насколько TQuery удобнее TTable


 
Юрий Зотов ©   (2014-07-15 13:48) [58]

> эта пять   (15.07.14 13:22) [55]

> выполнив sql-запрос, мы поучаем тупой датасет.

Вот интересно - а почему он тупой?

> Выполнив тот же запрос и переведя его в дом, у нас остаются
> все те же селективные возможности (точно такие же как в sql, только
> намного более гибкие).


Угу. Вот только расширенные селективные возможности в этой задаче на фиг не нужны, а платить за них (не нужные!!!) таки придется:
- надо подключать еще и DOM (расход ресурсов);
- надо перегонять датасет в DOM;
- DOM-навигация сложнее и потому дороже навигации по датасету;
- и как она реализована внутри - не через ли те же самые циклы?

PS
В свете сказанного: что называть говнокодом - вопрос открыт. Например, говнокодом можно называть использование рояля в качестве подставки под сковородку. У рояля ведь тоже гораздо больше возможностей, чем у просто подставки - он еще умеет музыку играть. Вот используем мы обычную подставку, а завтра нам музыки захочется, что тогда делать?


 
Юрий Зотов ©   (2014-07-15 14:42) [59]

Кстати, насчет 3000 записей - это я взял, наверное, с 20-кратным запасом. Реально их будет вряд ли более 150 - количество детей заданного пола, рожденных в заданный день и имеющих заданные ФИО. Так что цикл по датасету пролетит моментально - скорее всего, намного быстрее, чем одна только перегонка в DOM, не говоря уже об остальном. И без лишней траты памяти.


 
Пит   (2014-07-15 14:51) [60]

дядь Юр, а ты чего, в пенсионный фонд ушел?


 
Юрий Зотов ©   (2014-07-15 15:05) [61]

> Пит   (15.07.14 14:51) [60]

Почему ушел? Не уходил я никуда. Есть проект, в нем ПФР - заказчик, а мы - подрядчики.


 
эта пять   (2014-07-15 15:25) [62]

Вот интересно - а почему он тупой?
Там же русскими буквами было написано (пока не стерли)
датасет - это навигация.
дом - это запросы.

ладно, пофик датасеты расскажу я лучше вот это:

мериканцы в прошлом веке шибко сильно изучали разных приматов. ну там много интересных экспериментов, среди которых был такой:

в вольере устоявшаяся стая шимпанзе.
Вожак, несколько бета-самцов, самки и прочее. Полная иерархия.
Стаю кормят, но не так чтобы те отказались от еще.
Посреди вольера стоит клетка с бананами.
Через прутья к ним не дотянуться, а двёрка клетки на замке (открывается без ключа, но надо знать секрет).
В общем бананы те все видят, но никто не ест, ибо не достать.
Какое-то время испытатели ждут, затем, когда попыток достать бананы уже не наблюдается, они
изымают из стада последнего омегу и сажают тово в отдельный вольер с такой же точно банановой заманухой.
И учат его открывать клетку с бананами.
Потом снова ждут, покуда тот станет делфимастером по открыванию клетки с бананами.
Затем возвращают его в стадо.

Оказавшись в стае:

1. Омега видит, что клетку с бананми по прежнему никто даже не пытается открыть.
2. У всего стада на виду омега открывает клетку и начинает жрать банан.
3. Спустя пять секунд омега получает люлей от вожака, и лишается банана.
3. Некоторая пауза. Испытатели загружают в клетку новую партию бананов.
4. ГоуТу пункт 1.

Предыдущий цикл (во временных рамках эксперимента) был бесконечным.

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

А мораль басни такова:

Стадо никогда не учится и не пользуется опытом соплеменника, если тот не имеет статуса, выше некого порога.
Даже если всем очень хочется бананов.


 
Пит   (2014-07-15 15:28) [63]


> Есть проект, в нем ПФР - заказчик

ах, ну да.. я что-то не подумал о таком варианте ))

Все на java?


 
эта пять   (2014-07-15 15:35) [64]

1. Угу. Вот только расширенные селективные возможности в этой задаче на фиг не нужны, а платить за них (не нужные!!!) таки придется:

далее идет очень длинный и страшный список искупительных жертв необходимых для использования дом

а потом вдруг

2. Кстати, насчет 3000 записей - это я взял, наверное, с 20-кратным запасом.


 
Эрик Теодор   (2014-07-15 15:46) [65]


> эта пять   (15.07.14 15:25) [62]


> мериканцы в прошлом веке шибко сильно изучали разных приматов.
>  ну там много интересных экспериментов, среди которых был
> такой:

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


 
KSergey ©   (2014-07-15 15:48) [66]

> Юрий Зотов ©   (15.07.14 11:39) [44]
> Суть:
> - совпадение всех 7 полей считаем полным;
> - совпадение всех 5 обязательных полей при несовпадении
> серии или номера паспорта  считаем неполным;
> - несовпадение хотя бы одного из 5 обязательных полей считаем
> "не найден".
>
> select серия_паспорта, номер_паспорта
> from ...
> where <5 обязательных полей> // будет не более 3000 записей.

Вполне подход.

Либо подход ВладОшин ©   (15.07.14 13:19) [54], что в чем-то тоже самое. Вопрос только в том,
- нагружаем мы канал сервер <-> клиент (вариант ЮЗ)
- нагружаем мы сервер построением временных таблиц (вариант ВладОшин)

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

Я бы еще такой вариант посмотрел:

1) select ... where совпадение всех 7-ми полей
Нашли чего-то - полное соответствие
Не нашли
2) select ... where совпадение  5-ти обязательных полей + номер паспорта
Нашли - частичное совпадение
Не нашли
3) select ... where совпадение  5-ти обязательных полей + серия паспорта
Нашли - частичное совпадение
Не нашли - ну значит нету.

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

Но надо экспериментировать.


 
Inovet ©   (2014-07-15 15:53) [67]

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

Типичные ошибки в ФИО: "д"/"т", "ь" пропущен/лишний, ддвойные/одинарные "н" и т.п.. При смене ФИО тоже не торопятся бежать в пенсионный. Недавно реабилитировали "ё", наконец до них дошло, то эта буква нужна, но 95% отались с "е", при паспорте с "ё".

Надо таки вводить допуск на расхождение 1-2 буквы при поиске.


 
эта пять   (2014-07-15 16:13) [68]

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

можешь считать что описанный опыт это фейк.
только вот засада-то какая.
у меня конечно нет стада ни обезъян ни даже вольера, но что при этом мне мешает проверить этот фейк на практике?
/* без клеток, обезъян и бананов. */

ничто не мешало и прямо сейчас никто и ничто не мешает.


 
Юрий Зотов ©   (2014-07-15 16:38) [69]

> эта пять   (15.07.14 15:25) [62]

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

Басня, конечно, интересная, однако же, серьезных доводов я так и не услышал. А посты следовало бы читать полностью и цитировать, не вырывая фразы из контекста. Потому что там еще сказано: "Так что цикл по датасету пролетит моментально - скорее всего, намного быстрее, чем одна только перегонка в DOM, не говоря уже об остальном. И без лишней траты памяти".

> KSergey ©   (15.07.14 15:48) [66]

Главное, наконец-то нащупана идея, а остальное уже вопросы реализации. Попробуем - увидим.

Тоже могу рассказать басню о том, как мудрая сова посоветовала мышам стать ежиками, чтобы их не жрали кто попало и на вопрос "а как же стать ежиками?" ответила, что это уже вопросы реализации.
:o)

> Inovet ©   (15.07.14 15:53) [67]

В том разделе БД, с которым я работал, ошибки ФИО тоже есть, но их очень и очень немного. А программа еще и вынуждает их исправлять: каждый персональный входящий документ проверяется на совпадение СНИЛС и ФИО, а при несовпадении отвергается с указанием причины. Поэтому деваться юзерам некуда (документ-то вводить надо, вот и приходится сначала корректировать ФИО).


 
эта пять   (2014-07-15 16:47) [70]

Фишка в том, что альфе гораздо проще сделать то, что он уже умеет

Вы так это говорите словно это что-то плохое.
Или словно я этого не понимаю.
Или словно никто этого не понимает.

А фишка на самом деле не в том, что было проще альфе, а в том, что все шимпанзе хотели съесть банан, но лишь смотрели на него.

"Так что цикл по датасету пролетит моментально - скорее всего, намного быстрее, чем одна только перегонка в DOM, не говоря уже об остальном. И без лишней траты памяти".

Если вместо TQuery взять TTable, то цикл по последней тоже пролетит моментально.


 
Юрий Зотов ©   (2014-07-15 16:51) [71]

> эта пять   (15.07.14 16:13) [68]
> ничто не мешало и прямо сейчас никто и ничто не мешает.


Эдакие социологические исследования проводим и глЫбокие выводы делаем, досель науке неизвестные? Ну-ну, попутного за воротник.

Только эта... (шесть)... есть один нюанс: если результат социологического эксперимента трактуется самим экспериментатором, то грош ему цена, такому результату. Поскольку он всегда будет отражать личное мнение этого самого экспериментатора, и не более. То есть, с тем же результатом эксперимент можно было и вообще не проводить.

Расскажу-ка и я Вам сказку про социологические  исследования группы приматов. Сидят в клетке две гориллы - старая и молодая. Старая говорит молодой: "Знаешь, что такое условный рефлекс?". Та отвечает: "Нет". Старая: "Cмотри - сейчас я дерну вот за эту веревку и вон тот в белом халате принесет нам по банану".

Как Вы думаете - а какие выводы из того же самого эксперимента сделал "вон тот в белом халате"?
:o)


 
эта пять   (2014-07-15 16:54) [72]

Ну-ну, попутного за воротник.

я согласен, что это несколько (может быть) обидно, но исследования-то есть.
даже если про мериканцев мой источник врёт.


 
ухты   (2014-07-15 16:56) [73]

вывод - в экспериментах толку ноль :)


 
Юрий Зотов ©   (2014-07-15 16:56) [74]

> эта пять   (15.07.14 16:47) [70]

Поздравляю - у Вас отличное чувство юмора.

А аргумент насчет TQuery и TTable - да, это сильный аргумент. И очень по сути, главное.


 
Пит   (2014-07-15 17:10) [75]

Дядь Юр, так ты все на джаве?

По прежнему хаишь относительно дельфи или привык?


 
_Inovet   (2014-07-15 17:17) [76]

> на совпадение СНИЛС и ФИО

Так ошибки именно в этом сочетании. А другая база есть ли у них? Я к чему: если при поиске ввести правильные ФИО с паспорта, то можно не найти ничего. Если этого не требуется, так и ладно. А ошибок не так уж и мало 1-2%, наверное, есть.


 
Юрий Зотов ©   (2014-07-15 18:45) [77]

> Пит   (15.07.14 17:10) [75]

Привык-то я давно, но иногда все же раздражает догматическая концепция "всё есть объект". Например, чтобы просто прочитать текстовый файл, сначала нужно создать 4 объекта: File, FileInputStream, InputStreamReader, BufferedReader.

Конечно, есть и удобные вещи, но, думаю, в современных Delphi они тоже уже есть.

> _Inovet   (15.07.14 17:17) [76]
> если при поиске ввести правильные ФИО с паспорта, то можно
> не найти ничего.


Если в БД на этом СНИЛСе другие ФИО, то выдаст ошибку несовпадения. Которая все же заставит юзера сначала обновить ФИО в БД (потому что иначе он документ не введет).

В основном, ошибки несовпадения ФИО как раз из-за устаревших ФИО в БД (типа, женщина вышла замуж, сменила фамилию, получила новый паспорт, а идти в пенсионку лень или вообще забыла).


 
эта пять   (2014-07-15 19:49) [78]

А аргумент насчет TQuery и TTable - да, это сильный аргумент. И очень по сути, главное.

а разве не сильный?
ок. я записываю.
ЮЗ не видит большой разницы между первым и вторым.

а разве не по сути?
что вы можете после получения датасета?
некст/приор/мувбай/фёрст/и ласт?

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

а я могу сделав селект и получив датасет снова делать селекты (не теряя кстати и циклов по индексу списка).
а к результатам селекта я снова могу применять селекты.
а еще результаты селекта могут быть переданы в качестве параметров (а вы попробуйте передайте рекорд датасета куда-нить)

но развеж это все важно? развеж это все по сути?
когда есть циклы....


 
Kerk ©   (2014-07-15 19:54) [79]

Я наверно потерял нить обсуждения, но что именно в этой задаче мешает решить ее средствами SQL без дополнительной обработки на клиенте? Даже если SQL не помогает, то на стороне сервера, если СУБД приличная, есть и курсоры, и XPath (уж кому что нравится). Зачем тащить это на клиент?


 
ухты   (2014-07-15 21:31) [80]

правильно, клиент должен быть браузер
а ежели чего то и сервер приложений доделает дело, или юзер за клиентом, выборка то не такая большая в итоге


 
Юрий Зотов ©   (2014-07-15 22:10) [81]

> эта пять   (15.07.14 19:49) [78]
> а я могу сделав селект и получив датасет снова делать селекты


Купите корову.

Kerk ©   (15.07.14 19:54) [79]
> Я наверно потерял нить обсуждения,


Потерял. Нужна была идея, а не способ ее реализации. Это уж я сам как-нибудь.

> All

Други! Поверьте, что я в достаточной степени осведомлен о преимуществах и недостатках как DOM,  так и реализации функционала на сервере или клиенте. Но в этой ветке речь идет совершенно о другом - см. [0].

Еще поверьте, что, задавая вопрос, я вычленил только то, что к нему и относится, намеренно опустив все несущественные для сабжа детали. На самом деле там и трехзвенка, и веб-морда, и XML присутствует.

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

Заранее благодарен. Особенно высказавшимся по сути.


 
ухты   (2014-07-15 22:29) [82]

так и делайте как говорите
создавайте выборки с доп. полем типа статуса, не совпали фио - A, не совпали номера - Б, ну или что там у вас .. юзеру и гоните это сгруппировано, он сам определит или условия менять или из списка выбирать
ну а если веб. у вас то как все, начал вводить первые 10 (15,20 по вкусу) ему в автокомплетед списке.. интерактив, что тут страшного


 
ухты   (2014-07-15 22:31) [83]


> ну а если веб.
а по сути все равно :)


 
Юрий Зотов ©   (2014-07-15 22:44) [84]

> ухты   (15.07.14 22:29) [82]
> создавайте выборки с доп. полем типа статуса, не совпали фио - A, не
> совпали номера - Б, ну или что там у вас .. юзеру и гоните это
> сгруппировано, он сам определит или условия менять или из списка
> выбирать


Благодарю за совет, но он снова не по сабжу. Где создать поле статуса, что, зачем и в каком виде гнать юзеру - это я расписал еще на прошлой неделе.


 
Kerk ©   (2014-07-15 22:46) [85]

Тогда я не понимаю в чем вопрос, ибо сама идея озвучена в [0], осталось только реализовать.
Ухожу-ухожу, извините :)


 
ухты   (2014-07-15 22:58) [86]


> Kerk ©   (15.07.14 22:46) [85]
согласен

идею чего надо, в чем загвоздка? :)


 
Юрий Зотов ©   (2014-07-15 23:26) [87]

Kerk ©   (15.07.14 22:46) [85]
> ухты   (15.07.14 22:58) [86]


Кто хотел понять - тот понял. См., например, [10], [11], [29], [37], [44], [66].


 
ухты   (2014-07-15 23:46) [88]

пользователя надо обламывать по мере ввода
фамилий %иванов% не миллион, а гораздо меньше, а таких сергеев/петь/... еще меньше, до паспорта можно и не дойти никогда, или его достаточно
другое дело что, по хорошему, фио + пол + дата != уникально, но так это уже не проблема запросов


 
Юрий Зотов ©   (2014-07-15 23:55) [89]

> ухты   (15.07.14 23:46) [88]

> до паспорта можно и не дойти никогда, или его достаточно
> фио + пол + дата != уникально, но так это уже не проблема запросов


Вот! Нужно лишь вдуматься в сабж. Видите - Вы вдумались и все поняли.

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


 
ухты   (2014-07-16 00:04) [90]


> В сабже о юзере - ни слова.
кхм, ну так вы еще чего нибудь того -  "намеренно опустив все несущественные для сабжа детали", тогда точно идеи как рекой хлынут :)

Вот! тут и приходит тот самый контекст, которого "опустили" :)


 
ухты   (2014-07-16 00:12) [91]


> Но объясни это той девочке-операторше, которая сегодня поругалась
> с парнем и вводит номер 000123 как 123, а завтра с парнем
> помирилась и вводит номер 000123 полностью.
да и тут вот как надо было понимать, куда и зачем она что-то вводит и почему ее не считать за юзера?


 
Kerk ©   (2014-07-16 00:23) [92]

Это тривиальная задача для любой нормальной СУБД. Почти "hello world". Если б название СУБД не было "несущественной деталью", тут бы даже код давно привели бы.


 
Юрий Зотов ©   (2014-07-16 00:50) [93]

> ухты   (16.07.14 00:04) [90]
> Вот! тут и приходит тот самый контекст, которого "опустили"


И остается только удивляться - как же нашлись люди, которые сумели-таки понять сабж?

> Kerk ©   (16.07.14 00:23) [92]

> Это тривиальная задача для любой нормальной СУБД. Почти "hello world".
> Если б название СУБД не было "несущественной деталью", тут бы даже код
> давно привели бы.


Рома, это DB2. Теперь с нетерпением жду подтверждения твоих слов - то есть, твоего кода. Заранее спасибо.


 
Inovet ©   (2014-07-16 02:43) [94]

> [93] Юрий Зотов ©   (16.07.14 00:50)
> то есть, твоего кода

Ещё подспорье для написания кода - формат обмена. Это уже устаревший, они его любят каждый год новый делать, часто радикально новый, но обязательна совместимость вниз со старыми документами
http://base.consultant.ru/cons/cgi/online.cgi?req=doc;base=LAW;n=143763;dst=0;ts=A3B6768EFF0A0AB54A0BFEC97C1C00C7;r nd=0.7258964089122141


 
Германн ©   (2014-07-16 02:46) [95]


> Рома, это DB2. Теперь с нетерпением жду подтверждения твоих
> слов - то есть, твоего кода. Заранее спасибо.

Это удар ниже пояса, Юр. :)


 
Юрий Зотов ©   (2014-07-16 07:36) [96]

> Германн ©   (16.07.14 02:46) [95]

Ну, если решение "тривиальной задачи для любой нормальной СУБД. Почти "hello world" является ударом ниже пояса, то я уж и не знаю, что тогда является просто аргументом.

"Hello, world" пишется за минуту. Почти "hello world" - ну, пусть минут за 5. Полагаю, Ромина репутация стоит того, чтобы потратить на нее какие-то несчастные 5 минут.


 
Юрий Зотов ©   (2014-07-16 07:47) [97]

> Inovet ©   (16.07.14 02:43) [94]

> Ещё подспорье для написания кода - формат обмена.


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


 
Focus   (2014-07-16 09:02) [98]

db2tomysql,
db2toaccess,
db2to....
?


 
ВладОшин ©   (2014-07-16 09:31) [99]


> неважно, как вводится, кем вводится, в каком виде вводится

имхо, важно..
Если автоматом каким по 100500 за раз - то одно, а если девочкой - то другое.
Девочка будет психовать если отклика нет

А если забубенить индексов на все, и спрашивать аля
select count(*) as ПО_ФИО from .. where фио=fio
union all
select count(*) as ПО_ДАТЕ from .. where дата=date
и т.п.

потом имеем 7 цифр для анализа

а бороться с тормозом-вставкой в проиндексированное насмерть - писать новые документы в доп. место. Потом по накоплению ~ 1000 сбрасывать  в основную фоном


 
ВладОшин ©   (2014-07-16 09:40) [100]


> select count(*) as ПО_ФИО from .. where фио=fio
> union all
> select count(*) as ПО_ДАТЕ from .. where дата=date

не, ерунда

так
count по обязательным
uniuon
count по всем

или, если поддерживает

WITH CTE (поля )
AS
( select поля  from  по обязательным)
select count from CTE
union all
select count from CTE where по НЕобязательным


 
Юрий Зотов ©   (2014-07-16 10:01) [101]

> ВладОшин ©   (16.07.14 09:31) [99]

Влад, не надо домысливать того, чего нет в сабже. Нет в нем ни девочки, ни GUI, ни 100500 документов. Сказано - вводится документ (один!), в котором такие-то поля заполнены обязательно, а такие-то необязательно. И все.

И неважно как, неважно кем/чем, неважно в каком виде этот документ вводится. И нужна была даже не реализация, а лишь идея - как различить разные случаи, не делая при этом кучу огромных выборок. А для этого даже и тип СУБД не важен, потому что куча огромных выборок - она и в любой СУБД есть куча огромных выборок. А идея, как этой кучи избежать - она и есть идея, она в любой СУБД работать будет, с отличиями лишь в деталях реализации (если эти детали еще будут, потому что не исключено, что здесь можно обойтись лишь стандартным SQL).

Вот Роман приведет код для DB2 (в чем мы, конечно же, не сомневаемся), а мы тут же попросим его привести аналогичный код для любой другой СУБД и потом спросим - а чем эти два кода отличаются в идейном плане? И тут неожиданно выяснится, что практически ничем, отличия лишь в реализации.

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


 
ВладОшин ©   (2014-07-16 10:13) [102]


> Юрий Зотов ©   (16.07.14 10:01) [101]

ok

тогда ты все сказал - выбрать обязательное, из него необязательное.
Мне только не понравились циклы.


 
Inovet ©   (2014-07-16 10:13) [103]

> [99] ВладОшин ©   (16.07.14 09:31)
> Если автоматом каким по 100500 за раз - то одно, а если
> девочкой - то другое.

Не знаю, что за участок Юра делает, но обычно приносят/передают по каналам связи в ПФ как раз по 100500 за раз готовых документов, сотрудник ПФ запускает загрузку их в базу, происходит проверка на соответсвие всекой фигни в том числи и ФИО со СНИЛС, о выдаётся протокол ошибок, которые надо исправить и ещё раз передать заново сформированные документы, снова ПОЛНЫМ пакетом - т.е. те же 100500.

Ну там при личном обращении сотрудник может заполнить самостоятельно какой-нить документ-запрос. Наверно скоро и сам застрахованный лиц через ВЕБ сможет это делать. В частности, что я видел, через Сбербанк-онлайн уже сейчас можно. Тоже ведь документ-запрос XML уйдёт из Сбербанка в ПФ, назад вернётся документ-ответ XML. Весь формат описан по ссылке выше в "Приложении 4".

Интересно узнать, что же к этой системе будет прикручено в сабже.


 
Inovet ©   (2014-07-16 10:25) [104]

> [103] Inovet ©   (16.07.14 10:13)
> что же к этой системе будет прикручено в сабже.

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


 
Юрий Зотов ©   (2014-07-16 10:41) [105]

> Inovet ©   (16.07.14 10:25)

АДВ-8 на регионе. Там пачка, но очень небольшая, ни о каких 100500 речь не идет.


 
Kerk ©   (2014-07-16 11:05) [106]

Суть:
- совпадение всех 7 полей считаем полным;
- совпадение всех 5 обязательных полей при несовпадении серии или номера паспорта  считаем неполным;
- несовпадение хотя бы одного из 5 обязательных полей считаем "не найден".


SELECT
 mandatory_field1,
 mandatory_field2,
 mandatory_field3,
 mandatory_field4,
 mandatory_field5,
 optional_field1,
 optional_field2,
 CASE
   WHEN optional_field1 = ? and optional_field2 = ? THEN "FULL"
   ELSE "PARTIAL"
 END
 AS TYPE
FROM TABLE
WHERE mandatory_field1 = ?
 AND mandatory_field2 = ?
 AND mandatory_field3 = ?
 AND mandatory_field4 = ?
 AND mandatory_field5 = ?

Что в итоге имеем? В поле TYPE будет строка "FULL" для полных совпадений или строка "PARTIAL", если совпадают хотя бы обязательные поля. Сортировки и дополнительные условия можно добавить по вкусу.

2 минуты на написание и 3 минуты на гугл (ради оператора CASE), ибо непосредственно с DB2 я почти не пересекался. Стоило все это 6 страниц обсуждать?

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


 
Пит   (2014-07-16 11:11) [107]


> ради оператора CASE

так case в большинстве БД есть, и в оракле тоже


 
Kerk ©   (2014-07-16 11:13) [108]


> Пит   (16.07.14 11:11) [107]

Ну естественно в большинстве, я ж сразу сказал, что в любой нормальной СУБД это делается легко. Но я же не помню конкретный синтаксис. Вообще, я оператор IF искал, но как я понял, его в DB2 нету, только CASE. В результате одно и то же, но тем не менее нюанс.


 
Kerk ©   (2014-07-16 11:15) [109]

К моему большому сожалению, я уже скоро год как не работаю с БД, так что многое уже уходит из памяти, да.


 
Inovet ©   (2014-07-16 11:33) [110]

> [105] Юрий Зотов ©   (16.07.14 10:41)
> АДВ-8

Мда. Так более понятно. Ну т.е. сотрудник ЗАГСа заполняет документы по своим данным, которые уж более актуальны должны быть в ЗАГСе тем более для АДВ-8, но СНИЛСа сотрудник не знает. В ПФ они могут отличаться, как я говорил уже. А юридически можно ли сотруднику ЗАГСа выдавать список подходящих лиц в случае неполного совпадения или более одного полного совпадения? От этого зависит и подход. Например, можно при наличии документа удостоверяющего личность и несовпадении ФИО, выдавать ФИО по документу из базы, так делается по СНИЛСу при проверке. А вот без документа УЛ список может получаться довольно большим, это если учитывать расхождения в 1-2 буквах. Если расхождения не уччитывать, то "не найден", "найдено столько-то записей" выдать их, и по этим случаям уже искать вручную другими путями.

Всё к тому, что реальность далека от идеала. Например сотрудник ПФ иногда идёт на встречу и смотрит в базе СНИЛС по паспортным данным при телефонном разговоре, когда особо одарённые сотрудники отдела кадров умудряются принять человека, а СНИЛС забывают взять, а человек отработал 3 дня и пропал. Ещё хуже когда такой человек отработал 3 дня по договору, а живёт в другом регионе, тогда неофициально узнать не получится, потому что на местах только кусок базы. Вбить левый СНИЛСс сдать, потом после локальной приёмки по региональной базе через месяц другой придёт ошибка из общей базы, тогда и исправлять уже.


 
Inovet ©   (2014-07-16 11:35) [111]

Да чё вы про эти БД, тут других проблем полно будет, вон выше часть описал. А БД фигня, что там сложного.


 
Kerk ©   (2014-07-16 11:39) [112]


> Inovet ©   (16.07.14 11:35) [111]
>
> Да чё вы про эти БД, тут других проблем полно будет, вон выше часть описал.

В том, что ты выше описал, заключается реальная постановка задачи. Но реальную постановку задачи нам тут никто не сообщил. Так что решаем ровно то, что озвучено.

> А БД фигня, что там сложного.

Ну я-то вижу, да. Тут уже и циклы по датасетам, и DOM, и XPath. Все наприменяли кто что знал.


 
Пит   (2014-07-16 11:50) [113]


> К моему большому сожалению, я уже скоро год как не работаю
> с БД

ты ж вроде разрабатывал какую то фишку для БД


 
Kerk ©   (2014-07-16 11:56) [114]


> Пит   (16.07.14 11:50) [113]

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


 
имя   (2014-07-16 12:50) [115]

Удалено модератором


 
Пит   (2014-07-16 13:17) [116]


> Было такое да.

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


 
junglecat   (2014-07-16 13:19) [117]

> [114] Kerk ©   (16.07.14 11:56)

Надо же, у меня сейчас тоже подобный проект. Надеюсь, не слишком надолго)


 
Kerk ©   (2014-07-16 13:32) [118]


> Пит   (16.07.14 13:17) [116]

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


> junglecat   (16.07.14 13:19) [117]
>
> > [114] Kerk ©   (16.07.14 11:56)
>
> Надо же, у меня сейчас тоже подобный проект. Надеюсь, не
> слишком надолго)

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


 
Юрий Зотов ©   (2014-07-16 13:43) [119]

> Kerk ©   (16.07.14 11:05) [106]

1. Код кривой - нет варианта "не найден".
2. Зачем включать в выборку обязательные поля, если они же задаются в параметрах?
3. Ты использовал уже готовое решение [44], а не сабж.
4. И ты сам подтвердил, что суть сабжа вовсе не конккретной СУБД.


 
Kerk ©   (2014-07-16 13:57) [120]


>  Юрий Зотов ©   (16.07.14 13:43) [119]
> 1. Код кривой - нет варианта "не найден".

Пустой ответ - это вариант "не найден".

> 2. Зачем включать в выборку обязательные поля, если они
> же задаются в параметрах?

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

> 3. Ты использовал уже готовое решение [44], а не сабж.

Нет, я использовал не решение [44], а постановку задачи из [44]. Решение там крайне кривое.

> 4. И ты сам подтвердил, что суть сабжа вовсе не конккретной СУБД.

Я об этом сказал еще в [92]. Задача решается в практически любой СУБД элементарно. Но так как ты выпрашиваешь код, то без названия конкретной СУБД код написать нельзя.

---

На самом деле тут все просто. Будем считать, что "полное совпадение" - это просто совпадение всех полей. ОК. Тогда вся задача сводится к одному вопросу: а что считать "неполным совпадением"? Или перефразируя: а чем "неполное совпадение" отличается от "несовпадения"? Но не зная всех маленьких нюансов постановки задачи, на этот вопрос ответить не сможет никто. Телепаты в отпуске.

Поэтому вместо разговора по сути мы тут имеем яростную самодемонстрацию "несколько другого уровня" автора.

Я ведь даже проявил фантазию и телепатически предположил в [106] еще один вариант решения. Но автор не ценит труд отвечающих почему-то.


 
antonn ©   (2014-07-16 14:11) [121]

Может это попытка рассказать о "серьезной" задаче хоть кому нибудь?
про хранимку и перенос логики в БД сказали сразу же в первом ответе, а без конкретики - переливание


 
Юрий Зотов ©   (2014-07-16 14:29) [122]

Удалено модератором


 
Юрий Зотов ©   (2014-07-16 14:41) [123]

> antonn ©   (16.07.14 14:11) [121]
> про хранимку и перенос логики в БД сказали сразу же в первом ответе


Именно. Собственно, оно и так было ясно, ничего тут нового нет, преимущества и недостатки всем известны. И с XML то же самое.

Нужны были идеи, а не их конкретная реализация - о чем в сабже прямо и написано. Идея же созрела в [44] и была подтверждена в [66], а затем в [102], после чего ветку уже можно было закрывать.

Но тут подошел Киндзюлис...
(с) Литовский народный фольклор.


 
Kerk ©   (2014-07-16 14:49) [124]

Удалено модератором


 
Пит   (2014-07-16 14:57) [125]

Удалено модератором


 
Kerk ©   (2014-07-16 15:01) [126]

Удалено модератором


 
Юрий Зотов ©   (2014-07-16 15:15) [127]

Удалено модератором


 
Kerk ©   (2014-07-16 15:20) [128]

Удалено модератором


 
Юрий Зотов ©   (2014-07-16 15:20) [129]

> All

На сим откланиваюсь. Задача решена, поэтому ее дальнейшее обсуждение уже не имеет смысла, а холивары и перепалки оставим холиварщикам и перепальщикам.

Спасибо всем.


 
ухты   (2014-07-16 15:31) [130]

Удалено модератором


 
ВладОшин ©   (2014-07-16 19:38) [131]


> KSergey ©   (15.07.14 15:48) [66]
>
> Мой опыт подсказывает, что иногда серверу становится тяжко
> с этими временными таблицами при большом количество клиентских
> запросов разных клиентов

mssql?

просто
есть такое же подозрение.. причем, проявляется "резко"
т.е. нормально-нормально и тут бац - "вторая смена" ..
и по логам тормоз в  tempdb

с др. стороны, когда в основном все клиенты по всей России через инет сидят - иначе как непонятно.

Да и переписываь много уже :)

поэтому продолжаем temp_table юзать активно..

"и надёжа таперича токма " на апгрейд дисковой системы. Давно не менялась, говорят
 должно помочь, а то уже стремноватая.


 
SergP ©   (2014-07-16 20:19) [132]


> Юрий Зотов ©   (14.07.14 21:27)
>
> Есть БД, в ней данные о людях. Обязательные поля - ФИО,
> пол, дата рождения. Необязательные поля (т.е. могут быть
> пустыми) - серия и номер паспорта. Таких записей - десятки
> миллионов.
>
> Вводится документ, в нем те же поля. Требуется проверить,
>  есть ли такой человек в БД и в зависимости от результатов
> проверки отнести вводимый документ к одной из трех групп:
>
> А). найден с полным соответствием полей;
> Б). найден с неполным соответствием полей;
> В). не найден.


Хм... А что означает "неполное соответствие"?
если совпали например пол и дата рождения, а ФИО не совпало, то что оно Вам даст в случае таблицы с десятками миллионов записей? Вы же так можете получить выборку с несколькими тысячами записей где имеет место "неполное соответствие".



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2015.02.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.87 MB
Время: 0.006 c
11-1258454605
Dy1
2009-11-17 13:43
2015.02.15
GroupBox


15-1405024202
Юрий
2014-07-11 00:30
2015.02.15
С днем рождения ! 11 июля 2014 пятница


2-1389346370
NNK_RTR
2014-01-10 13:32
2015.02.15
Компонент RichEdit


11-1258403062
abyss_by
2009-11-16 23:24
2015.02.15
KOLmdvXLGrid из KOLmdvControls. D7


15-1405172152
Пит
2014-07-12 17:35
2015.02.15
Лучшее средство разработки для WEB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский