|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Существует такая проблема Есть две таблицы Calls (DialedNumber,Duration,RateId,Cost) - телефонные звонки (50000-1млн записей) Например 70957777777 60 5 NULL 78122222222 60 6 NULL 78123222222 60 6 NULL Rates (RateId,DestinationCode,Rate) - тарифы (>200000 записей) Например 5 7095 0,5 6 7095 0,5 6 7812 0,5 - действителен для всех звонков вида 7812xxx кроме 78122 6 78122 0,1 таким образом звонки должны тарифицироваться согласно тарифу для кода который наиболее совпадает с набранным номером т.е. 7812222222 будет по тарифу 0,1 ,а 7812322222 по тарифц 0,5. Собственоо вопрос - как это лучше всего реализовать на SQL Server? Пробовал три способа 1. Цикл по длинне кода в таблице rates - оказался самый быстрый DECLARE @codelen tinyint SELECT @codelen=10 WHILE @codelen>0 BEGIN UPDATE calls SET cost=duration*Rate WHERE substring(DialedNumber,1,datalength(DestinationCode))=DestinationCode and datalength(destinationcode)=@codelen and calls.rateid=rates.rateid and cost is null SELECT @codelen=@codelen-1 END 2. Один запрос - очень медленно UPDATE calls SET cost=duration*rates.rate from rates WHERE rates.Destinationcode=(select max(destinationcode) from rates r1 where dialednumber like code+'%' and rates.rateid=r1.rateid) and rates.rateid=calls.rateid 3 Перебор звонков в курсоре - еще медленнее. Ести ли у кого идеи как это еще можно реализовать поменяв структуру базы и/или запросы? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2001, 15:45 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Если есть возможность, то менять нужно структуру базы, табличка Calls у Вас явно не укладывается даже в 1-ю НФ, поскольку поле DialedNumber содержит составные данные а именно - Код звонка и Номер Звонка. Пэтому и такие трудности с выборкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2001, 16:33 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Недообъяснял Я имел в виду то, что вам нужно как минимум разделить столбец DialedNumber на два, хотя подозреваю что вся схема данных непродумана и несоответствует предметной области. Если Ваша система сейчас только разрабатывается я бы посоветовал серьезно взяться за разработку схемы данных. Почитайте Дейта. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2001, 16:37 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Согласенс Genady. Добавлю еще что такая постановка не верна в принципе. Например, в Вашем примере был звонок 78123222222. Т.е. (7812)3222222. А как будет выглядеть номер звонка в этот же город с местным телефоном 2222222? (7812)2222222. А в Вашем представлении - 78122222222, что ничем не отличается от (781)22222222. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2001, 17:15 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Я так понимаю что номера приходят без разделения их на код города и собственно номер. В принципе можно их разделять при вставке. Но наверное не стоит, т.к. таблица меняется оперативно и тормозить тут нельзя. Можно таблицу Rates записывать примерно так: 5 7095% 0,5 6 7095% 0,5 6 7812[^2]% 0,5 6 78122% 0,1 и тогда всё будет делаться одним запросом ... WHERE DialedNumber like DestinationCode ... правда замучиешься вести таблицу Rates Я бы остановился на твоём первом варианте, только написал бы WHERE DialedNumber like DestinationCode+'%' and datalength(DestinationCode)=@codelen... но это дело вкуса С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2001, 17:30 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Сергей, вы правы - номера приходят с АТС в неразделенном виде. Генадий, Идея разделять номер на код+остаток была, но она не годится в силу того что для разных тарифных планов могут использоватся разные набор кодов, например, Набраны 781223456 -для клиента с планом N1 781223456 -для клиента с планом N2 В Плане 1 задан только код 7 -$0,2 В Плане 2 заданы коды 7812 - 0,10 78122 -0,05 То есть получаем что один и тот же номер должен разбится в одном случае как (7)81223456 а в другом как (78122)3456. таким образом мы не можем заранее сказать что номер состоит из кода и остатка не посмотрев на тарифный план. Дмитрий, не совсем понял ваш пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 15:26 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>Идея разделять номер на код+остаток была, но она не годится в силу того что для разных тарифных планов могут использоватся >разные набор кодов, например Это не повод запихивать два атрибута в один, отношение многие ко многим никто не отменял Анализ предметной области при правильном определении сущностей и их атрибутов спасут "отцов русской демократии" Как я писал уже ранне нужно просто серьезно отнестись к проектированию схемы данных, начиная с концептуальной модели да помогут вам ER диаграммы ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 15:59 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>>Это не повод запихивать два атрибута в один, отношение многие ко многим никто не отменял. В том-то все и дело, что это изначально один атрибут -номер "физически" набранный на телефоне. Задача в том и состоит чтобы наиболее эффективным способом разделить этот номер на два атрибута- "значащий код" на основе которого звонку ставится в соответствие тариф и "балласт" -остаток номера. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 16:54 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Может есть какие нибудь идеи по поводу модификации таблицы Rates? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 17:12 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Вобщем я тут посмотрел внимательно беру свои слова назад, правда не совсем, ошибка все таки у Вас есть, поскольку я не вижу связи Rates c Calls если бы RateID был PK, то все можно было бы сделать просто: update Calls set Calls.Cost = Calls.Duration * Rates.Rate from Calls, Rates where Calls.RateID = Rates.RateID В Вашем случае можно обойтись, но не советую, таким запросом: update Calls set Calls.Cost = Calls.Duration * Rates.Rate from Calls, Rates where Calls.RateID = Rates.RateID and Rates.DestinationCode = substring(Calls.DialingNumber, 1, len(Rates.DestinationCode)) Вобщем совет - определитесь с ключиками P.S. Вопрос: а вычисляемое поле сознательно храните? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 17:20 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Да, Вы правы нужно модифицировать Rates, поскольку номер есть номер, но код все равно хранить надо отдельно, вот только непонятно назначение поля RateID. Кстати хорошей практикой является натменование таблиц в единственном числе, поскольку каждая запись таблицы определяет один экземпляр конкретной сущности (логической или физической), проще потом будет разбираться в схеме, да и в построении помогает ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 17:26 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
RateID это номер тарифной таблицы которую необходимо использовать для тарификации того или иного звонка. PK для таблицы Rates это (rate_id,destinationcode): RateId,DestinationCode,Rate --начало первой таблицы 1 7095 0,2 1 7096 0,1 1 7812 0,3 1 78122 0,2 1 781222 0,3 --начало второй таблицы 2 7095 0,01 2 7096 0,02 2 7812 0,03 -- начало третей таблицы 3 7 0,20 Увы,ваш запрос будет работать в случае таблиц 1 и 3, но в случае 2 несработает: набранному номеру 78122222 будут соответствовать три позиции таблицы -где гарантия что UPDATE будет использовать именоо 781222 ? Если бы можно было сделать UPDATE.... ORDER BY DATALENGTH(781222) DESC - тогда да. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 17:39 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
По поводу единственного числа, не судите строго - я просто привел упрощенный пример, на самом деле все в единственном числе называется да и таблицы не из трех полей состоят (да и не две их там..). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 17:47 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Ууууу, как все запущено дядюшка Кодд учит нас убирать повторяющиеся группы из таблиц Табличка то Rates у вас в 1-й НФ, вы запихнули две сущности в одну, мой совет, тарифные планы и коды разделить надобно, всей постановки не знаю, но возможно, что код звонка нужно просто атрибутом запихнуть в Call, ну что бы сказать поточнее надо анализировать. Кстати почитайте Дейта, хотя бы до глав по нормальным формам, уделив внимание на аномалим обновления, вставки и удаления в различных формах - гарантирую Вы порадуетесь. кстати, мой запросик таки сработает правильно я предположил, что ключ у Вас составной, поэтому substr-ом его как бы ввел в табличку Calls, но мой совет остается в силе - Rates надо делить ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 18:10 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Читал я все это.Rates специально денормализована для ускорения работы. Когда идет UPDATE на 1000000 записей то тут не до нормальных форм. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2001, 21:02 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Кстати, запросик то сработает, но не гарантированно - зависит от того в каком порядке "Физически" были вставлены записи в таблицу Rates. Пример: CREATE TABLE Calls (DialedNumber varchar(14),Duration int,RateId int,Cost money) CREATE TABLE Rates (RateId int,DestinationCode varchar(14),Rate money) INSERT INTO Calls (DialedNumber,Duration,RateId)VALUES ('7095x',60,5) INSERT INTO Calls (DialedNumber,Duration,RateId)VALUES ('78122x',60,6) INSERT INTO Calls (DialedNumber,Duration,RateId)VALUES ('78123x',60,6) INSERT INTO RATES (RateId,DestinationCode,Rate) VALUES (5,'7095',0.5) --Вставляем сначала короткий код а затем длинный INSERT INTO RATES (RateId,DestinationCode,Rate) VALUES (6,'7812',1) INSERT INTO RATES (RateId,DestinationCode,Rate) VALUES (6,'78122',2) update Calls set Calls.Cost = Calls.Duration * Rates.Rate from Calls, Rates where Calls.RateID = Rates.RateID and Rates.DestinationCode = substring(Calls.DialedNumber, 1, len(Rates.DestinationCode)) select * from calls --Получаем результат: DialedNumber Duration RateId Cost -------------- ----------- ----------- --------------------- 7095x 60 5 30.0000 78122x 60 6 120.0000 78123x 60 6 60.0000 truncate table rates INSERT INTO RATES (RateId,DestinationCode,Rate) VALUES (5,'7095',0.5) -- а теперь вставляем сначала длинный код а затем короткий INSERT INTO RATES (RateId,DestinationCode,Rate) VALUES (6,'78122',2) INSERT INTO RATES (RateId,DestinationCode,Rate) VALUES (6,'7812',1) update Calls set Calls.Cost = Calls.Duration * Rates.Rate from Calls, Rates where Calls.RateID = Rates.RateID and Rates.DestinationCode = substring(Calls.DialedNumber, 1, len(Rates.DestinationCode)) select * from calls DialedNumber Duration RateId Cost -------------- ----------- ----------- --------------------- 7095x 60 5 30.0000 78122x 60 6 60.0000 78123x 60 6 60.0000 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 09:23 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Ндааа..... денормализация позволяет ускорить select, а уж никак не update 8-[] Интересно как Вы себе это представляете? Подумайте сами, вместо обновления одной записи Вам приходится обновлять набор записей. Запрос щас проверять лень, потом посмотрю, но даже если не работает, ситуация лечится просто Вопрос: если у Вас в Rates составной PK, то почему FK у вас состоит из части PK????!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 10:22 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Так я же SELECT и ускоряю - SELECT идет из денормализованной RATES для update таблицы Calls. >>Вопрос: если у Вас в Rates составной PK, то почему FK у вас состоит из части PK????!!! Непонял, почему части? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 11:06 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
A запрос можно просто cut and paste сделать в Query analyser - только результаты SELECT'ов удалить и запустить. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 11:07 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>Когда идет UPDATE на 1000000 записей то тут не до нормальных форм. Очепятка что ли? Насколько я понял отношение между Rates и Calls - один ко многим, соответственно составной PK Rates должен присутствовать как FK в Calls и проблем как не бывало ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 11:22 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Да в этом то задача и состоит чтобы определить какому PK в Rates соответствует запись в Calls. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 11:54 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>Да в этом то задача и состоит чтобы определить какому PK в Rates соответствует запись в Calls. Уффф... Victor, если бы Вы внимательно читали литературу по реляционным базам, то Вы бы знали, что для этих целей используют связку PK -> FK и не придумывали бы себе проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 12:06 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Действительно Уффф. Такое впечатление что мы с вами говорим на разных языках. Может я чего-то не улавливаю, но я не вижу каким образом ваши комментарии относительно определения ключей имеют отношение к моей задаче. Если можно, приведите конкретный пример. >>>>Когда идет UPDATE на 1000000 записей то тут не до нормальных форм. >> Очепятка что ли? Имел в виду что UPDATE calls SET rate=..... FROM rates --вот он SELECT который я имел в виду WHERE .... будет быстрее чем UPDATE calls SET rate= FROM rates_normalized inner join codes on.. inner join ... inner join ... inner join ... WHERE ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 12:31 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2Genady ну есть две таблица id tel -- ---- 1 111 2 222 3 233 code rate ---- ---- 1 4 2 5 23 6 как получить табличку tel rate --- ---- 111 4 222 5 233 6 ? Что об этом в книгах пишут? Как по другому таблицы организовать? Чиста канкретна можете написать? А критиковать-то и советовать книжки почитать - это просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 12:36 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Да уж, действительно на разных языках Вот что я хотел сказать: Судя по тому, что вам нужно связать строки из Calls со строками из Rates, между этими таблицами существует отношение и это отношение - один ко многим. Первичный ключ Rates состоит из двйх полей - RateID, DestinationCode. Для того, чтобы организовать отношение Parent Child, нужно из парента передать в чилд первичный ключ в виде внешнего ключа, т. е. поля составляющие первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное соответствие. Уфф замаялся я совсем с Вами, по моему я объяснил достаточно подробно. Если непонятно я уже ничего сделать не могу, учите матчасть ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 12:46 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2Genady Дык вот вы такой умный - напишите структуру таблиц с ключами и запрос. Неужели это так сложно, с вашей-то начитанностью? Всего-то две таблички. Мне искренне интересно как это надо правильно организовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:10 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 SergSuper Для двух табличек я и написал т. е. в Calls присутствует RateID, а DestinationCode почему то нет. Чиста канкретна схему данных я написать не могу, для этого анализ ПО нужен, уж пусть Victor этим и займется. Выпады по поводу книг в общем то смешны Я искренне советовал, поскольку по части теории у Виктора заметные пробелы, кстати совсем недавно я сам такой был, могу сказать, что знание теории мне совсем не мешает ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:23 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>>Для того, чтобы организовать отношение Parent Child, нужно из парента передать в чилд первичный ключ в виде внешнего ключа, т. е. поля составляющие первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное соответствие. Так я, блин, это и хочу сделать! Попытаюсь уточнить формулировку задачи подругому: В таблицу Calls переодически заносятся данные поступающие от внешной системы в поля DialedNumber,Duration,RateID. Задача: как создать производную таблицу calls1 или какие поля необходимо добавить в существующую таблицу Calls для того чтобы наиболее быстрым способом производить описаный в моем первом сообщении расчет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:28 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>>Для двух табличек я и написал т. е. в Calls присутствует RateID, а DestinationCode почему то нет. Так его потому и нет, что это часть решаемой задачи - необходимо по номеру определить какай DestinationCode ему соответсвует и по найденному DestinationCode определить тариф. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:34 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>Так его потому и нет, что это часть решаемой задачи - необходимо по номеру определить какай DestinationCode ему соответсвует и >по найденному DestinationCode определить тариф. А откуда он у Вас берется в Rates? Я бы посоветовал все же нормализовать Rates, полагаю все же join-ы будут быстрее, чам ваша посимвольная обработка. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:50 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Уфф устал прям. Виктор, если хотите пришлите мне по e-mail вашу ER-диаграмму, можно в копиях экрана, только чтоб не мегабайты весила, и краткое описание работы, я посмотрю и скажу что на мой взгляд не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:59 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Могу в ErWin 3.52 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:04 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 Genady "Чиста канкретна схему данных я написать не могу, для этого анализ ПО нужен, уж пусть Victor этим и займется." Ну и как тут не вспомнить фразу: "Кто умеет тот делает, кто не умеет тот учит". Я привел всего 2 таблицы из двух полей каждая - какой еще нужен анализ ПО? К сожалению данная задача не попадает под чистые, красивые схемы, описанные в учебниках, хоть их до дыр читай. У меня была похожая проблемма - расчет банковских нормативов. Там складывается куча счетов, причем задаётся обычно несколько первых цифр счета. Я тоже долго думал как это лучше сделать - ничего красивого не получается. На первый взгляд вроде и есть первичный и вторичный ключи, но приглядишься - вроде их и нет. И надо либо их как-то генерить и работать по теории, либо оставить теории в сторону и думать самому. Обычно второе предпочтительней. Поэтому совет Вам - не судите с наскока, не разобравшись. Если критикуете чего-то - покажите как сделать лучше. С приветом Сергей PS. Надеюсь я ничего обидного не написал? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:07 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>>Я бы посоветовал все же нормализовать Rates, полагаю все же join-ы будут быстрее, чам ваша посимвольная обработка. Так посоветуйте! Как? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:20 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Сергей, интересно было бы услышать, как вы решили вашу проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:22 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 Victor Присылайте, у меня power designer, но он по моему умеет открывать ErWin диагграмы 2 SergSuper >Ну и как тут не вспомнить фразу: "Кто умеет тот делает, кто не умеет тот учит". Спорить не буду, может быть так и есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:26 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 Victor "интересно было бы услышать, как вы решили вашу проблему." А как я в самом начале написал - записывал счета так, чтобы их можно было сравнить like-ом. Но у меня было несколько сложнее, допустим все счета 322...., но кроме тех у которых 5-я цифра 1 (от балды пример). Ну и приходилось писать: 322_[^1]%. Но вести такую таблицу - никому не пожелаю. Допустим чтобы написать: все счета 3..... кроме 32219..., надо вставить 3[^2]% 32[^2]% 322[^1]% 3221[^9]% Однажды написав, разобраться в этом очень тяжело, счетов много, отсортировать по смыслы никак ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 16:31 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Да уж, это будет похуже моего случая. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 10:35 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 Victor К сожалению я не смог открыть Вашу диаграмму но я немного посоображал и хочу задать Вам несколько вопросов, ответив на которые Вы несколько проясните картину, во всяком случае для меня. Тогда возможно на диаграмму смотреть и не прийдется Вот эти вопросы: 1. Вам не кажется, что таблицы Calls и Rates должны быть связаны? 2. В таблице Calls вы храните вычисляемое поле Cost, с чем это связано? 3. Какое назначение поля RateId? Как я понимаю это идентификатор, идентификатор чего? 4. Каким образом заносятся значения поля DestinationCode? Удачи ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 11:16 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Самый интересный первый вопрос. Что бы понять, попробуйте связать для начала две таблицы: 1. русский алфавит 2. все слова русского языка Вроде же они должны быть связаны и понятно как. Ну и что по этому поводу в умных книжках пишут? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 12:22 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>Вроде же они должны быть связаны и понятно как. >Ну и что по этому поводу в умных книжках пишут? Я подожду ответы Victorа, потом отвечу и Вам, ОК? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 12:32 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Генадий, а ERX тоже не открывается? Как я сказал, это просто пример, поэтому такая структура. 1.Вам не кажется, что таблицы Calls и Rates должны быть связаны? Они и будут связаны когда в результате расчета станет известно какой тариф применять, т.е. UPDATE будет вида set cost=,rateid=,destinationcode= 2. В таблице Calls вы храните вычисляемое поле Cost, с чем это связано? Это связано с тем, что COST вычисляется довольно сложным способом учитывая всевозможные варианты округления длительности звонка и период действия тарифного плана (как я сказал приведенный пример весьма упрощенный). Проводить эти вычисления каждый раз когда необходимо сформировать отчет по таблице calls не имеет смысла с точки зрения произоводительности. 3. Какое назначение поля RateId? Как я понимаю это идентификатор, идентификатор чего? Это идентификатор тарифного плана. Если более подробно: имеем таблицы RateHeader - Список тарифных планов, RateId,RateName 1,Любимый 2,Серебрянный CustomerAccounts - список номеров клиентов account,rateid 7660222,1 7660333,1 7770333,2 ну и соответственно Calls -звонки сделанные клиентами (Account,DialedNumber,Duration,-известны RateId,Cost,DestinationCode) -вычисляются Rates - детали тарифных планов. соответственоо в UPDATE добавится FROM rates,customerservice where rates.rateid=customerAccounts.rateid and customeraccounts.account=calls.account вместо calls.rateid=rates.rateid как в примере. 4. Каким образом заносятся значения поля DestinationCode? Есть справочник кодов - из него выбираются. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 14:24 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>Генадий, >а ERX тоже не открывается? Ко мне приходил только ER1, если Вы посылали ERX сегодня, тогда я смогу посмотреть его только вечером дома, на работе у меня нет такой возможности. >Они и будут связаны когда в результате расчета станет известно какой тариф применять, т.е. UPDATE будет вида >set cost=,rateid=,destinationcode= То есть Вы хотите установить связь программно. А почему Вас не устраивает связь средствами СУБД? >Это связано с тем, что COST вычисляется довольно сложным способом учитывая всевозможные варианты округления длительности >звонка и период действия тарифного плана (как я сказал приведенный пример весьма упрощенный). Проводить эти вычисления каждый >раз когда необходимо сформировать отчет по таблице calls не имеет смысла с точки зрения произоводительности. Понятно, спасибо. >Это идентификатор тарифного плана. Если более подробно: Понятно >ну и соответственно >Calls -звонки сделанные клиентами >(Account,DialedNumber,Duration,-известны >RateId,Cost,DestinationCode) -вычисляются На каком этапе вычисляется DestinationCode? И на каком этапе проводится обновление Calls, я имею в виду поле Cost? >Rates - детали тарифных планов. Насколько я понимаю Rates это тоже справочник? >Есть справочник кодов - из него выбираются. Дайте пожалйста структуру справочника. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 14:55 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 SergSuper >Вроде же они должны быть связаны и понятно как. >Ну и что по этому поводу в умных книжках пишут? Как и обещал отвечаю: Должны быть связаны и связаны все же несколько разные понятия. Понятно кому? И интересно как? По поводу русского алфавита и слов, просто связать конечно нельзя, но я как то не понял аналогии, в телефонном номере что, может быть произвольное количество кодов, раставленых в произвольном порядке? Впрочем, можно связать и алфавит со словами, если рассмотреть что у слова кроме атрибута - буква есть атрибут - позиция этой буквы в слове. В общем как то я не очень понимаю смысл Ваших наездов, что Вам собственно не понравилось? То что я посоветовал почитать книги, дабы лучше ориентироваться хотя бы в терминологии? Откровенно говоря Ваша кусючесть меня озадачивает ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 11:56 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
"Должны быть связаны и связаны все же несколько разные понятия" Собственно я это и пытался высказать. И это тоже Ваши слова: ", т. е. поля составляющие первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное соответствие." А "кусючесть"... Ну не люблю я когда человек критикует, советует книжки почитать, а сам предложить ничего не может Может перебрал немного, извиняюсь С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 12:47 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>И это тоже Ваши слова: >", т. е. поля составляющие первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное >соответствие." Дык в том же и дело, что почти сразу посоветовал связать эти таблици, и пытался разными словами объяснить почему, вот только Виктор почему то никак не мог понять что я ему советую, хотя выше приведенная фраза по моему однозначна Вот я отсылал его к книгам, чтоб прочитал, да разобрался Что касается обид, так я и не обижался просто Ваша некоторая злобность меня удивила не мог понять из-за чего ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 13:16 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Генадий, не совсем понял, что вы имеете в виду под: "То есть Вы хотите установить связь программно. А почему Вас не устраивает связь средствами СУБД?" Далее, "На каком этапе вычисляется DestinationCode? И на каком этапе проводится обновление Calls, я имею в виду поле Cost?" В процессе UPDATE. Справочник DestinationCode - список всех возможных кодов Destinationcode (PK) - собственно сам код Description - описание Например 44 - United Kingdom 441 - London 4412 - London Cellular ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 14:22 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
IMHO, обсуждение зашло в тупик и стало походить на толчение воды в ступе. Попытаюсь несколько освежить обсуждение (если получится ). Мне приходилось решать аналогичную проблему, причем как раз с кодами междугородних префиксов. Просто тот, кто придумывал коды, понятия не имеет о реляционной алгебре, и в голове у него каша, поэтому не нужно сгоряча пинать программиста, который эту кашу пытается расхлебать. Вариант SergSuper весьма оригинален, и лично мне понравился. Другое дело, что юзерам подобные записи могут быть непривычны и малопонятны: 3[^2]% 32[^2]% 322[^1]% 3221[^9]% 32219% Я вижу два варианта структуры данных, которые могут оказаться более удобными с точки зрения восприятия простого обывателя. Вариант 1. Табличный с приоритетами. Prefix Priority 32219 1 3221 2 322 3 32 4 3 5 Фактически здесь написано то же самое, что в примере SergSuper. После префикса подразумевается символ маски %, но юзер его не видит, и в обморок не падает. Ему достаточно понимать, что в конкретном телефонном номере из данных префиксов будет использован тот, у которого префикс совпадает с первой частью набранного телефонного номера, а значение Priority минимально. Вариант 2. Древовидная структура префикса. 3 / \ 2 прочие / \ 2 прочие / \ 1 прочие / \ 9 прочие Это дерево отражает тот же самый пример. Фраза "прочие" подменяет собой символ маски %. Пример не совсем удачный, поскольку дерево вышло очень похожим на бинарное. На самом деле следует использовать B-дерево (один узел может иметь более двух дочерних элементов). На самом деле оба примера реализуют примерно один и тот же подход. В варианте с деревом в каждом узле нужно хранить информацию о текущей глубине дерева, и для однозначного соответствия следует искать префикс с наибольшей глубиной дерева *аналогично приоритету в примере 1). В общем, это скорее варианты визаульной реализии одного и того же подхода. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 14:57 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>не совсем понял, что вы имеете в виду под: >"То есть Вы хотите установить связь программно. А почему Вас не устраивает связь средствами СУБД?" Программно это то, что Вы показывали ранее, т. е. в момент обновления Calls вы с помошью цикла определяете соответствие двух таблиц, проводите обновление и все, связь теряется, предположите теперь, что Вам нужно выдать отчет по клиенту с данными о том по каким кодам он звонил и например, сумму оплаты по каждому коду, Вы что снова будуте цикл использовать?? Я не знаю динамики Вашей системы, но косвенно по Вашим описаниям предполагаю, что обновление поля Cost происходит пакетно, т. е. обновляются множество записей уже после того как данные по звонкам занесены. Естественно цикл работает на каждой записи и это не повышет быстродействия системы. А теперь предположите еще и такое - значение Rate было введено с ошибкой и спустя какое то время ошибка обнаружена - снова цикл? Связь обеспечивается СУБД с помощью связки Первичный ключ - Внешний ключ, эта связь обеспечивает однозначную и непротиворечивую связь обеих таблиц. В вашем случае эта связка усложняется из-за поля Cost, значения, которого необходимо проверять с промощью триггеров, как минимум после обновления таблицы Rates. Возможны и другие случаи при которых нужна такая проверка, но это уже виднее Вам, т. к. я не знаю вашей системы в целом. В случае этой связи Вам при занесении записи в Calls необходимо будет записать в нее RateID и DestinationCode как раз именно для установления связи, в этот же момент можно записать и Cost но не обязательно. Проблема определения DestinationCode в этом случае будет не проблемой базы, а скорее проблемой приложения, которое собственно и заносит данные в Вашу таблицу. Сделать это можно будет как минимум не сложнее Вашего решения, однако определение DestinationCode в данном случае будет производиться только один раз! Как я уже говорил, я не знаю как к Вам приходят номера, но предполагаю, что не по 100 млн. одновременно, соответственно определение DestinationCode пусть даже и в цикле но по мере поступления записей звонков, вероятнее всего не будет сильно сказываться на производительности системы. Уфф, аж устал набивать Надеюсь понятно объяснил, если нет, то чесслово понятней не умею P.S. Как установить связь в СУБД я писал Вам в ответе на Ваше письмо, если оно не пришло, я повторю ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:11 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
Григорий, я пожалуй прислушаюсь к Сергею по поводу ведения таблицы его способом -"Но вести такую таблицу - никому не пожелаю". Дело в том что уровень вложенности может быть от 1 до 13 цифр, причем заранее не известно будет ли он менятся с течением времени (скорее всего будет). Если клиент имеет следующую разбивку: 7 73 7095 7333 7812 .. еще 40 кодов вида 7xxx 7095766 ... еще 50 кодов вида 7xxxxx то мне даже пытаться проанализировать как ЭТО записать в виде шаблонов страшно В варианте с приоритетом не совсем понятно,как я этот приритет смогу использовать в UPDATE - по моему только таким же образом, как я сейчас использую DATALENGTH - перебором от самого длинного кода/высокого приоритете к самому короткому/низкому. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:17 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 Garya Вариант 1. Табличный с приоритетами. Дык вся трудность в том, что один номер соответствует нескольким префиксам и довольно трудно выбрать нужный(или циклом, как это сделал Victor(на мой взгляд лучший вариант), или с вложенным запросом, как это бы сделал я) Наверное идеально было бы делать процедуру которая трансформировала бы такую таблицу в таблицу "моего" формата. Но наверное довольно сложно её написать. Вариант 2. Древовидная структура префикса. А можно чуть поподробней? Чего-то мне не представить как это будет выглядеть. Ну там структура таблиц, болванка запроса... С приветом Сергей PS. Хорошо что перешли в конструктивное русло PPS. А я бы не судил так строго "того, кто придумывал коды". Не самое плохое решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:18 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
По поводу хранения в Calls полей RateId и DestinationCode я уже писал: 19 Марта: >1.Вам не кажется, что таблицы Calls и Rates должны быть связаны? >> Они и будут связаны когда в результате расчета станет известно какой тариф применять, т.е. UPDATE будет вида set cost=,rateid=,destinationcode= Письмо пришло, но все что вы там предлагаете мы уже обсудили. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:24 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
В принципе, то что использую я (UPDATE по длине кода) вполне успешно работает, просто хотелось понять - можно ли сделать лучше. Увы, пока остаюсь при своих. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:27 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
2 All Народ, аууу, либо я ничего совсем не понимаю, либо меня никто не понимает или не хочет слушать Проблему, после ее рассмотрения на самом деле можно разделить на две: 1. Ошибка проектирования, состоящая в том, что не связаны таблицы, для которых необходимо поддерживать соответствие. Я честно говоря не представляю как будет выглядеть запрос, о котором я писал в предыдущем постинге, а именно - Выдать суммы потраченные клиентами за месяц по каждому коду (считай тарифу). В случае, если Виктор будет использовать только ваши решения. 2 Проблема разделения разных данных, пришедших одним блоком. Возможно (но не обязательно) если будет устранена проблема1, проблема2 не будет такой уж страшной, а если нет, то может стоит подумать о решении обеих проблем. Чой то мне кажется, что без устранения проблемы1 у Виктора могут появиться проблема3....проблемаN. Я не прав? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:35 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>Увы, пока остаюсь при своих. запросов - Выдать суммы потраченные клиентами за месяц по каждому коду (считай тарифу) или подобных у Вас не будет никогда?? А изменения однажды занесенных Rate вы запрещаете? А Rate у Вас не меняется со временем никогда?? А если меняется, данные по стоимости звонков у Вас лежат только в Cost? В общем вопросы можно задавать и задавать, ответов на них я вероятно не услышу, надеюсь мне не прийдется работать с подобной системой ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:44 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>>Народ, аууу, либо я ничего совсем не понимаю, либо меня никто не понимает или не хочет слушать. И меня! И меня! Я же написал ( уже два раза по-моему) , что таблица Calls связывается с Rates по DestinationCode и RateId, которые заполняются тогда же, когда считается Cost. >> 2 Проблема разделения разных данных, пришедших одним блоком. Что имеется в виду? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:44 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
А изменения однажды занесенных Rate вы запрещаете? >> Разрешаются, но изменения в таблицу Calls автоматически не попадают. Пересчет запускается принудительно в моменты маленькой загрузки. Связано с большими объемами данных. А Rate у Вас не меняется со временем никогда?? Меняется,в таблице Rates есть поле effective_date - дата с которой тариф действует. соответственно есть таблица rates_history - содержащая историю изменений. >> В общем вопросы можно задавать и задавать. Вопросы то задавать можно, но помоему с такими вопросами мы движемся не вперед а вширь. По-моему вышезаданные вопросы никоим образом к решению проблемы нас не приближают. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:51 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>> 2 Проблема разделения разных данных, пришедших одним блоком. >Что имеется в виду? О бог мой!!! Я же говорил, что по сути DialedNumber содержит два атрибута - Код и собственно номер. В общем вы можете объявить его одним атрибутом т. е. хранить его просто как номер, но от кода Вам никуда не деться это такой же атрибут звонка как и номер В общем Виктор, Ваше право оставить все по своему усмотрению это Ваша система, соответственно Вы и создаете ее как считаете нужным. По моему скромному мнению Вам еще не раз понадобится помощь в состалении изощренных запросов, компенсирующих плохо спроектированную схему данных Удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 15:53 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>>О бог мой!!! Я же говорил, что по сути DialedNumber содержит два атрибута - Код и собственно номер. В общем вы можете объявить его одним атрибутом т. е. хранить его просто как номер, но от кода Вам никуда не деться это такой же атрибут звонка как и номер В четвертый раз повторяю - в таблице Calls есть поле DestinationCode. >>По моему скромному мнению Вам еще не раз понадобится помощь в состалении изощренных запросов, компенсирующих плохо спроектированную схему данных. По моему скромному мнению,неплохо было бы подтвердить это утверждение схемой, которая лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 16:13 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>В четвертый раз повторяю - в таблице Calls есть поле DestinationCode. Сорри, увлекся и сразу не уяснил точнее умудрился не заметить Ну дык, тогда проблем с апдейтами не должно быть, особливо по полю Cost Ндааа, тяжелый случай ) так упрямо стремился донести правильную мысль, что не заметил момента, когда донес ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 16:36 |
|
UPDATE по совпадению в подстроке
|
|||
---|---|---|---|
#18+
>По моему скромному мнению,неплохо было бы подтвердить это утверждение схемой, которая лучше. Ну, по тому кусочку, который Вы мне давали лично у меня притензий нет P.S. Однако ничего себе веточка разрослась ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 16:40 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1827173]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 447ms |
0 / 0 |