powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE по совпадению в подстроке
61 сообщений из 61, показаны все 3 страниц
UPDATE по совпадению в подстроке
    #32003028
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Существует такая проблема

Есть две таблицы

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 Перебор звонков в курсоре - еще медленнее.

Ести ли у кого идеи как это еще можно реализовать поменяв структуру базы и/или запросы?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003033
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть возможность, то менять нужно структуру базы, табличка Calls у Вас явно не укладывается даже в 1-ю НФ, поскольку поле DialedNumber содержит составные данные а именно - Код звонка и Номер Звонка. Пэтому и такие трудности с выборкой.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003034
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недообъяснял

Я имел в виду то, что вам нужно как минимум разделить столбец DialedNumber на два, хотя подозреваю что вся схема данных непродумана и несоответствует предметной области. Если Ваша система сейчас только разрабатывается я бы посоветовал серьезно взяться за разработку схемы данных. Почитайте Дейта.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003036
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласенс Genady. Добавлю еще что такая постановка не верна в принципе. Например, в Вашем примере был звонок 78123222222. Т.е. (7812)3222222. А как будет выглядеть номер звонка в этот же город с местным телефоном 2222222? (7812)2222222. А в Вашем представлении - 78122222222, что ничем не отличается от (781)22222222.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003037
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю что номера приходят без разделения их на код города и собственно номер. В принципе можно их разделять при вставке. Но наверное не стоит, т.к. таблица меняется оперативно и тормозить тут нельзя.

Можно таблицу 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... но это дело вкуса

С приветом Сергей
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003064
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей,
вы правы - номера приходят с АТС в неразделенном виде.

Генадий,
Идея разделять номер на код+остаток была, но она не годится в силу того что для разных тарифных планов могут использоватся разные набор кодов, например,

Набраны
781223456 -для клиента с планом N1
781223456 -для клиента с планом N2

В Плане 1 задан только
код 7 -$0,2
В Плане 2 заданы коды
7812 - 0,10
78122 -0,05
То есть получаем что один и тот же номер должен разбится в одном случае как (7)81223456 а в другом как (78122)3456.
таким образом мы не можем заранее сказать что номер состоит из кода и остатка не посмотрев на тарифный план.

Дмитрий,
не совсем понял ваш пример.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003068
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Идея разделять номер на код+остаток была, но она не годится в силу того что для разных тарифных планов могут использоватся >разные набор кодов, например

Это не повод запихивать два атрибута в один, отношение многие ко многим никто не отменял

Анализ предметной области при правильном определении сущностей и их атрибутов спасут "отцов русской демократии"
Как я писал уже ранне нужно просто серьезно отнестись к проектированию схемы данных, начиная с концептуальной модели

да помогут вам ER диаграммы
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003070
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Это не повод запихивать два атрибута в один, отношение многие ко многим никто не отменял.
В том-то все и дело, что это изначально один атрибут -номер "физически" набранный на телефоне.
Задача в том и состоит чтобы наиболее эффективным способом разделить этот номер на два атрибута- "значащий код" на основе которого звонку ставится в соответствие тариф и "балласт" -остаток номера.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003072
victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может есть какие нибудь идеи по поводу модификации таблицы Rates?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003073
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем я тут посмотрел внимательно
беру свои слова назад, правда не совсем, ошибка все таки у Вас есть, поскольку я не вижу связи 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. Вопрос: а вычисляемое поле сознательно храните?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003074
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, Вы правы нужно модифицировать Rates, поскольку номер есть номер, но код все равно хранить надо отдельно, вот только непонятно назначение поля RateID.

Кстати хорошей практикой является натменование таблиц в единственном числе, поскольку каждая запись таблицы определяет один экземпляр конкретной сущности (логической или физической), проще потом будет разбираться в схеме, да и в построении помогает
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003075
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 - тогда да.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003076
victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу единственного числа,
не судите строго - я просто привел упрощенный пример, на самом деле все в единственном числе называется да и таблицы не из трех полей состоят (да и не две их там..).
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003079
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ууууу, как все запущено
дядюшка Кодд учит нас убирать повторяющиеся группы из таблиц

Табличка то Rates у вас в 1-й НФ, вы запихнули две сущности в одну, мой совет, тарифные планы и коды разделить надобно, всей постановки не знаю, но возможно, что код звонка нужно просто атрибутом запихнуть в Call, ну что бы сказать поточнее надо анализировать. Кстати почитайте Дейта, хотя бы до глав по нормальным формам, уделив внимание на аномалим обновления, вставки и удаления в различных формах - гарантирую Вы порадуетесь.


кстати, мой запросик таки сработает правильно я предположил, что ключ у Вас составной, поэтому substr-ом его как бы ввел в табличку Calls, но мой совет остается в силе - Rates надо делить
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003088
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читал я все это.Rates специально денормализована для ускорения работы. Когда идет UPDATE на 1000000 записей то тут не до нормальных форм.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003097
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, запросик то сработает, но не гарантированно - зависит от того в каком порядке "Физически" были вставлены записи в таблицу 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
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003101
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ндааа..... денормализация позволяет ускорить select, а уж никак не update 8-[]
Интересно как Вы себе это представляете? Подумайте сами, вместо обновления одной записи Вам приходится обновлять набор записей.

Запрос щас проверять лень, потом посмотрю, но даже если не работает, ситуация лечится просто
Вопрос: если у Вас в Rates составной PK, то почему FK у вас состоит из части PK????!!!
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003107
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я же SELECT и ускоряю - SELECT идет из денормализованной RATES для update таблицы Calls.
>>Вопрос: если у Вас в Rates составной PK, то почему FK у вас состоит из части PK????!!!

Непонял, почему части?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003108
victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A запрос можно просто cut and paste сделать в Query analyser - только результаты SELECT'ов удалить и запустить.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003110
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Когда идет UPDATE на 1000000 записей то тут не до нормальных форм.
Очепятка что ли?

Насколько я понял отношение между Rates и Calls - один ко многим, соответственно составной PK Rates должен присутствовать как FK в Calls и проблем как не бывало
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003112
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да в этом то задача и состоит чтобы определить какому PK в Rates соответствует запись в Calls.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003115
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Да в этом то задача и состоит чтобы определить какому PK в Rates соответствует запись в Calls.

Уффф... Victor, если бы Вы внимательно читали литературу по реляционным базам, то Вы бы знали, что для этих целей используют связку PK -> FK и не придумывали бы себе проблем.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003118
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно Уффф. Такое впечатление что мы с вами говорим на разных языках.

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

>>>>Когда идет 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
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003120
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

?

Что об этом в книгах пишут? Как по другому таблицы организовать?
Чиста канкретна можете написать?
А критиковать-то и советовать книжки почитать - это просто.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003121
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж, действительно на разных языках

Вот что я хотел сказать:

Судя по тому, что вам нужно связать строки из Calls со строками из Rates, между этими таблицами существует отношение и это отношение - один ко многим. Первичный ключ Rates состоит из двйх полей - RateID, DestinationCode. Для того, чтобы организовать отношение Parent Child, нужно из парента передать в чилд первичный ключ в виде внешнего ключа, т. е. поля составляющие первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное соответствие.

Уфф замаялся я совсем с Вами, по моему я объяснил достаточно подробно. Если непонятно я уже ничего сделать не могу, учите матчасть
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003126
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Genady

Дык вот вы такой умный - напишите структуру таблиц с ключами и запрос. Неужели это так сложно, с вашей-то начитанностью? Всего-то две таблички. Мне искренне интересно как это надо правильно организовать.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003128
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper

Для двух табличек я и написал т. е. в Calls присутствует RateID, а DestinationCode почему то нет.
Чиста канкретна схему данных я написать не могу, для этого анализ ПО нужен, уж пусть Victor этим и займется.

Выпады по поводу книг в общем то смешны
Я искренне советовал, поскольку по части теории у Виктора заметные пробелы, кстати совсем недавно я сам такой был, могу сказать, что знание теории мне совсем не мешает
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003129
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Для того, чтобы организовать
отношение Parent Child, нужно из парента передать в чилд первичный ключ в виде внешнего ключа, т. е. поля составляющие
первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное соответствие.

Так я, блин, это и хочу сделать! Попытаюсь уточнить формулировку задачи подругому:

В таблицу Calls переодически заносятся данные поступающие от внешной системы в поля DialedNumber,Duration,RateID.
Задача: как создать производную таблицу calls1 или какие поля необходимо добавить в существующую таблицу Calls для того чтобы наиболее быстрым способом производить описаный в моем первом сообщении расчет.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003130
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Для двух табличек я и написал т. е. в Calls присутствует RateID, а DestinationCode почему то нет.
Так его потому и нет, что это часть решаемой задачи - необходимо по номеру определить какай DestinationCode ему соответсвует и по найденному DestinationCode определить тариф.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003133
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Так его потому и нет, что это часть решаемой задачи - необходимо по номеру определить какай DestinationCode ему соответсвует и >по найденному DestinationCode определить тариф.
А откуда он у Вас берется в Rates?

Я бы посоветовал все же нормализовать Rates, полагаю все же join-ы будут быстрее, чам ваша посимвольная обработка.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003136
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уфф устал прям. Виктор, если хотите пришлите мне по e-mail вашу ER-диаграмму, можно в копиях экрана, только чтоб не мегабайты весила, и краткое описание работы, я посмотрю и скажу что на мой взгляд не так.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003138
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Могу в ErWin 3.52
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003141
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Genady

"Чиста канкретна схему данных я написать не могу, для этого анализ ПО нужен, уж пусть Victor этим и займется."

Ну и как тут не вспомнить фразу: "Кто умеет тот делает, кто не умеет тот учит".
Я привел всего 2 таблицы из двух полей каждая - какой еще нужен анализ ПО?

К сожалению данная задача не попадает под чистые, красивые схемы, описанные в учебниках, хоть их до дыр читай. У меня была похожая проблемма - расчет банковских нормативов. Там складывается куча счетов, причем задаётся обычно несколько первых цифр счета. Я тоже долго думал как это лучше сделать - ничего красивого не получается. На первый взгляд вроде и есть первичный и вторичный ключи, но приглядишься - вроде их и нет. И надо либо их как-то генерить и работать по теории, либо оставить теории в сторону и думать самому. Обычно второе предпочтительней.

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

С приветом Сергей
PS. Надеюсь я ничего обидного не написал?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003144
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Я бы посоветовал все же нормализовать Rates, полагаю все же join-ы будут быстрее, чам ваша посимвольная обработка.

Так посоветуйте! Как?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003145
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей,
интересно было бы услышать, как вы решили вашу проблему.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003147
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victor

Присылайте, у меня power designer, но он по моему умеет открывать ErWin диагграмы

2 SergSuper
>Ну и как тут не вспомнить фразу: "Кто умеет тот делает, кто не умеет тот учит".

Спорить не буду, может быть так и есть.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003162
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victor

"интересно было бы услышать, как вы решили вашу проблему."

А как я в самом начале написал - записывал счета так, чтобы их можно было сравнить like-ом. Но у меня было несколько сложнее, допустим все счета 322...., но кроме тех у которых 5-я цифра 1 (от балды пример). Ну и приходилось писать: 322_[^1]%. Но вести такую таблицу - никому не пожелаю. Допустим чтобы написать: все счета 3..... кроме 32219..., надо вставить
3[^2]%
32[^2]%
322[^1]%
3221[^9]%

Однажды написав, разобраться в этом очень тяжело, счетов много, отсортировать по смыслы никак
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003208
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да уж, это будет похуже моего случая.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003210
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victor
К сожалению я не смог открыть Вашу диаграмму но я немного посоображал и хочу задать Вам несколько вопросов, ответив на которые Вы несколько проясните картину, во всяком случае для меня. Тогда возможно на диаграмму смотреть и не прийдется

Вот эти вопросы:

1. Вам не кажется, что таблицы Calls и Rates должны быть связаны?
2. В таблице Calls вы храните вычисляемое поле Cost, с чем это связано?
3. Какое назначение поля RateId? Как я понимаю это идентификатор, идентификатор чего?
4. Каким образом заносятся значения поля DestinationCode?

Удачи
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003213
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый интересный первый вопрос.

Что бы понять, попробуйте связать для начала две таблицы:
1. русский алфавит
2. все слова русского языка

Вроде же они должны быть связаны и понятно как.
Ну и что по этому поводу в умных книжках пишут?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003215
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Вроде же они должны быть связаны и понятно как.
>Ну и что по этому поводу в умных книжках пишут?

Я подожду ответы Victorа, потом отвечу и Вам, ОК?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003218
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Генадий,
а 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?
Есть справочник кодов - из него выбираются.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003220
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Генадий,
>а ERX тоже не открывается?

Ко мне приходил только ER1, если Вы посылали ERX сегодня, тогда я смогу посмотреть его только вечером дома, на работе у меня нет такой возможности.

>Они и будут связаны когда в результате расчета станет известно какой тариф применять, т.е. UPDATE будет вида
>set cost=,rateid=,destinationcode=

То есть Вы хотите установить связь программно. А почему Вас не устраивает связь средствами СУБД?

>Это связано с тем, что COST вычисляется довольно сложным способом учитывая всевозможные варианты округления длительности >звонка и период действия тарифного плана (как я сказал приведенный пример весьма упрощенный). Проводить эти вычисления каждый >раз когда необходимо сформировать отчет по таблице calls не имеет смысла с точки зрения произоводительности.

Понятно, спасибо.

>Это идентификатор тарифного плана. Если более подробно:
Понятно

>ну и соответственно
>Calls -звонки сделанные клиентами
>(Account,DialedNumber,Duration,-известны
>RateId,Cost,DestinationCode) -вычисляются

На каком этапе вычисляется DestinationCode?
И на каком этапе проводится обновление Calls, я имею в виду поле Cost?

>Rates - детали тарифных планов.

Насколько я понимаю Rates это тоже справочник?

>Есть справочник кодов - из него выбираются.

Дайте пожалйста структуру справочника.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003261
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper
>Вроде же они должны быть связаны и понятно как.
>Ну и что по этому поводу в умных книжках пишут?

Как и обещал отвечаю:
Должны быть связаны и связаны все же несколько разные понятия. Понятно кому? И интересно как?

По поводу русского алфавита и слов, просто связать конечно нельзя, но я как то не понял аналогии, в телефонном номере что, может быть произвольное количество кодов, раставленых в произвольном порядке? Впрочем, можно связать и алфавит со словами, если рассмотреть что у слова кроме атрибута - буква есть атрибут - позиция этой буквы в слове.
В общем как то я не очень понимаю смысл Ваших наездов, что Вам собственно не понравилось? То что я посоветовал почитать книги, дабы лучше ориентироваться хотя бы в терминологии? Откровенно говоря Ваша кусючесть меня озадачивает
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003266
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Должны быть связаны и связаны все же несколько разные понятия"

Собственно я это и пытался высказать.

И это тоже Ваши слова:
", т. е. поля составляющие первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное соответствие."

А "кусючесть"...

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

Может перебрал немного, извиняюсь

С приветом Сергей
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003267
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>И это тоже Ваши слова:
>", т. е. поля составляющие первичный ключ Rates должны присутствовать Calls, таким образом будет организовано однозначное >соответствие."

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

Что касается обид, так я и не обижался просто Ваша некоторая злобность меня удивила
не мог понять из-за чего
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003269
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Генадий,
не совсем понял, что вы имеете в виду под:
"То есть Вы хотите установить связь программно. А почему Вас не устраивает связь средствами СУБД?"

Далее,
"На каком этапе вычисляется DestinationCode?
И на каком этапе проводится обновление Calls, я имею в виду поле Cost?"
В процессе UPDATE.

Справочник DestinationCode - список всех возможных кодов
Destinationcode (PK) - собственно сам код
Description - описание
Например
44 - United Kingdom
441 - London
4412 - London Cellular
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003271
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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). В общем, это скорее варианты визаульной реализии одного и того же подхода.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003272
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>не совсем понял, что вы имеете в виду под:
>"То есть Вы хотите установить связь программно. А почему Вас не устраивает связь средствами СУБД?"

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

Связь обеспечивается СУБД с помощью связки Первичный ключ - Внешний ключ, эта связь обеспечивает однозначную и непротиворечивую связь обеих таблиц. В вашем случае эта связка усложняется из-за поля Cost, значения, которого необходимо проверять с промощью триггеров, как минимум после обновления таблицы Rates. Возможны и другие случаи при которых нужна такая проверка, но это уже виднее Вам, т. к. я не знаю вашей системы в целом. В случае этой связи Вам при занесении записи в Calls необходимо будет записать в нее RateID и DestinationCode как раз именно для установления связи, в этот же момент можно записать и Cost но не обязательно. Проблема определения DestinationCode в этом случае будет не проблемой базы, а скорее проблемой приложения, которое собственно и заносит данные в Вашу таблицу. Сделать это можно будет как минимум не сложнее Вашего решения, однако определение DestinationCode в данном случае будет производиться только один раз!
Как я уже говорил, я не знаю как к Вам приходят номера, но предполагаю, что не по 100 млн. одновременно, соответственно определение DestinationCode пусть даже и в цикле но по мере поступления записей звонков, вероятнее всего не будет сильно сказываться на производительности системы.

Уфф, аж устал набивать
Надеюсь понятно объяснил, если нет, то чесслово понятней не умею

P.S. Как установить связь в СУБД я писал Вам в ответе на Ваше письмо, если оно не пришло, я повторю
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003273
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Григорий,

я пожалуй прислушаюсь к Сергею по поводу ведения таблицы его способом -"Но вести такую таблицу - никому не пожелаю".
Дело в том что уровень вложенности может быть от 1 до 13 цифр, причем заранее не известно будет ли он менятся с течением времени (скорее всего будет).
Если клиент имеет следующую разбивку:
7
73
7095
7333
7812
..
еще 40 кодов вида 7xxx
7095766
...
еще 50 кодов вида 7xxxxx
то мне даже пытаться проанализировать как ЭТО записать в виде шаблонов страшно

В варианте с приоритетом не совсем понятно,как я этот приритет смогу использовать в UPDATE - по моему только таким же образом, как я сейчас использую DATALENGTH - перебором от самого длинного кода/высокого приоритете к самому короткому/низкому.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003274
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya

Вариант 1. Табличный с приоритетами.
Дык вся трудность в том, что один номер соответствует нескольким префиксам и довольно трудно выбрать нужный(или циклом, как это сделал Victor(на мой взгляд лучший вариант), или с вложенным запросом, как это бы сделал я)
Наверное идеально было бы делать процедуру которая трансформировала бы такую таблицу в таблицу "моего" формата. Но наверное довольно сложно её написать.

Вариант 2. Древовидная структура префикса.
А можно чуть поподробней? Чего-то мне не представить как это будет выглядеть.
Ну там структура таблиц, болванка запроса...

С приветом Сергей
PS. Хорошо что перешли в конструктивное русло
PPS. А я бы не судил так строго "того, кто придумывал коды". Не самое плохое решение.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003275
victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу хранения в Calls полей RateId и DestinationCode я уже писал:
19 Марта:
>1.Вам не кажется, что таблицы Calls и Rates должны быть связаны?
>> Они и будут связаны когда в результате расчета станет известно какой тариф применять, т.е. UPDATE будет вида set cost=,rateid=,destinationcode=

Письмо пришло, но все что вы там предлагаете мы уже обсудили.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003276
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе, то что использую я (UPDATE по длине кода) вполне успешно работает, просто хотелось понять - можно ли сделать лучше.

Увы, пока остаюсь при своих.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003277
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 All
Народ, аууу, либо я ничего совсем не понимаю, либо меня никто не понимает или не хочет слушать
Проблему, после ее рассмотрения на самом деле можно разделить на две:
1. Ошибка проектирования, состоящая в том, что не связаны таблицы, для которых необходимо поддерживать соответствие.
Я честно говоря не представляю как будет выглядеть запрос, о котором я писал в предыдущем постинге, а именно - Выдать суммы потраченные клиентами за месяц по каждому коду (считай тарифу). В случае, если Виктор будет использовать только ваши решения.

2 Проблема разделения разных данных, пришедших одним блоком.
Возможно (но не обязательно) если будет устранена проблема1, проблема2 не будет такой уж страшной, а если нет, то может стоит подумать о решении обеих проблем. Чой то мне кажется, что без устранения проблемы1 у Виктора могут появиться проблема3....проблемаN.

Я не прав?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003278
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Увы, пока остаюсь при своих.

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

А изменения однажды занесенных Rate вы запрещаете?

А Rate у Вас не меняется со временем никогда?? А если меняется, данные по стоимости звонков у Вас лежат только в Cost?

В общем вопросы можно задавать и задавать, ответов на них я вероятно не услышу, надеюсь мне не прийдется работать с подобной системой
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003279
victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Народ, аууу, либо я ничего совсем не понимаю, либо меня никто не понимает или не хочет слушать.

И меня! И меня!
Я же написал ( уже два раза по-моему) , что таблица Calls связывается с
Rates по DestinationCode и RateId, которые заполняются тогда же, когда считается Cost.

>> 2 Проблема разделения разных данных, пришедших одним блоком.
Что имеется в виду?
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003281
victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А изменения однажды занесенных Rate вы запрещаете?
>> Разрешаются, но изменения в таблицу Calls автоматически не попадают. Пересчет запускается принудительно в моменты маленькой загрузки.
Связано с большими объемами данных.

А Rate у Вас не меняется со временем никогда??
Меняется,в таблице Rates есть поле effective_date - дата с которой тариф действует. соответственно есть таблица rates_history - содержащая историю изменений.

>> В общем вопросы можно задавать и задавать.

Вопросы то задавать можно, но помоему с такими вопросами мы движемся не вперед а вширь. По-моему вышезаданные вопросы никоим образом к решению проблемы нас не приближают.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003282
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> 2 Проблема разделения разных данных, пришедших одним блоком.
>Что имеется в виду?

О бог мой!!! Я же говорил, что по сути DialedNumber содержит два атрибута - Код и собственно номер. В общем вы можете объявить его одним атрибутом т. е. хранить его просто как номер, но от кода Вам никуда не деться это такой же атрибут звонка как и номер

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

Удачи.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003286
Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>О бог мой!!! Я же говорил, что по сути DialedNumber содержит два атрибута - Код и собственно номер. В общем вы можете
объявить его одним атрибутом т. е. хранить его просто как номер, но от кода Вам никуда не деться это такой же атрибут звонка как
и номер
В четвертый раз повторяю - в таблице Calls есть поле DestinationCode.

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

По моему скромному мнению,неплохо было бы подтвердить это утверждение схемой, которая лучше.
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003296
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>В четвертый раз повторяю - в таблице Calls есть поле DestinationCode.

Сорри, увлекся и сразу не уяснил точнее умудрился не заметить

Ну дык, тогда проблем с апдейтами не должно быть, особливо по полю Cost

Ндааа, тяжелый случай ) так упрямо стремился донести правильную мысль, что не заметил момента, когда донес
...
Рейтинг: 0 / 0
UPDATE по совпадению в подстроке
    #32003297
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>По моему скромному мнению,неплохо было бы подтвердить это утверждение схемой, которая лучше.
Ну, по тому кусочку, который Вы мне давали лично у меня притензий нет

P.S. Однако ничего себе веточка разрослась
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE по совпадению в подстроке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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