Существует ли стандартная схема таблиц SQL для переопределения значений по умолчанию «большой картинки» с более низкими подробностями уровня? - PullRequest
1 голос
/ 28 мая 2010

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

Скажем, продажи в США - 10 долларов, продажи в Великобритании - 20 долларов.

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

Теперь давайте предположим, что Аляска и Гавайи рассматриваются как особые случаи, они оба стоят 15 долларов

Это предполагает, что в таблице с указанием штатов Аляска и Гавайи взимается 15, но, по-видимому, нам нужно 48 (избыточных) строк со всеми 10. Это создает проблему для обслуживания, наш пользователь хочет набрать 10 только один раз, а НЕ 48 раз. Это не устраивает и Великобританию. В Великобритании нет штатов.

Предположим, мы добавили еще пару сквозных правил.

При заказе по телефону взимается дополнительная плата в размере 10%. При заказе через Интернет скидка 10%.

Но по некоторым причинам, наиболее известным владельцам бизнеса, на Гавайях веб-приложение / телефонная связь / скидки не применяются.

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

Ответы [ 4 ]

1 голос
/ 28 мая 2010

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

0 голосов
/ 28 мая 2010

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

Create Table ServiceCharges
    (
    Country char(3) not null                -- ISO 3166-2 alpha-3 code
    , StateOrProvince nvarchar(25) null     -- ideally a code but given multiple 
                                            -- countries, that may not be feasible
    , City nvarchar(128) null               -- again name
    , PostalCode    varchar(10) null                     
    , Rate decimal(16,4) not null               
    , Constraint CK_ServiceCharges_RateGTEZero Check ( Rate >= 0 )
    , Constraint CK_ServiceCharges_MinEntry Check ( Case
                                                    When Country Is Null 
                                                        And StateOrProvince Is Null
                                                        And City Is Null
                                                        And PostalCode Is Null Then 0
                                                        Else 1
                                                        End = 1 )
)

Это также можно разделить так, чтобы местоположения сохранялись в отдельной таблице с помощью суррогатного столбца LocationId, применяемого в таблице ServiceCharges. Этот дизайн не учитывает перекрытия, что ставит вопрос: что должно произойти в случае перекрытия? Что произойдет, если в США есть один заряд, а в TX - другой? Превышает ли TX скорость? Если это так, это означает, что выигрывает наиболее конкретное место, и мы можем определить конкретность по существованию Почтового индекса или следующего города или следующего штата StateOrProvince или только следующей страны.

0 голосов
/ 28 мая 2010

Один ответ:

create table charge( entity char(2) , amount int ) ;

insert into charge( entity, amount)  ( 'DF', 10 ) ; -- defualt;
insert into charge( entity, amount)  ( 'AK', 15 ) ; -- alaska;
insert into charge( entity, amount)  ( 'HI', 15) ; -- hiwaii;

Тогда:

select coalesce( amount,( select amount from charge where entity = 'DF') )
from charge where entity = 'DC';

получите сумму по умолчанию.

попеременно:

select amount
from charge 
where entity 
  = ( select coalesce( entity, 'DF') from charge where entity = 'DC');

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


Вы хотите общую технику / идиому или детальный дизайн для конкретного случая? Это общая идиома.

Если это особый случай, посмотрите на то, что сказал Роберт Харви: «Все остальные правила кажутся аддитивными». Если это так, ваш дизайн становится очень простым: таблица расходов или (лучше) таблица расходов, таблица юрисдикций и отношение «многие ко многим». Опять же, это работает только в аддитивном случае;

create table surcharges ( id int not null primary key, 
   description varchar(50) not null, amount int ) ;

create table jurisdiction ( id int not null primary key, 
   name varchar(50) not null, abbr char(5) );

create table jurisdiction_surcharge ( id int not null primary key, 
  jurisdiction_id int not null references jurisdiction(id),
  surcharge_id int not null references surcharge(id) );

insert into charges (description, amount) values ( 'Outside Continental US', 15 );

insert into jurisdiction (name, abbr) values ( 'Mainland US', 'CONUS');
insert into jurisdiction (name, abbr) values ( 'Alaska', 'AK');
insert into jurisdiction (name, abbr) values ( 'Hawaii', 'HI');

insert into jurisdiction_surcharge 
 values ( jurisdiction_id, surcharge_id) values ( 2, 1 );
insert into jurisdiction_surcharge 
 values ( jurisdiction_id, surcharge_id) values ( 3, 1 );

Список сборов:

select a.* 
from charges a 
join jurisdiction_charge b on (a.id = b.surcharge_id) 
join jurisdiction c on (c.id = b.jurisdiction_id)
where c.abbr='AK';

Сумма расходов:

select sum(a.amount)
from charges a 
join jurisdiction_charge b on (a.id = b.surcharge_id) 
join jurisdiction c on (c.id = b.jurisdiction_id)
where c.abbr='AK';
0 голосов
/ 28 мая 2010

Аляска и Гавайи взимаются в 15, но предположительно нам нужно 48 (избыточно) все строки говорят 10.

Нет, вам нужно три ряда: два для Аляски и Гавайев и один для континентальной части США.

Все остальные правила представляются аддитивными. В каждой таблице есть одна запись для каждого правила. Если правило не инициировано / не согласовано, плата не добавляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...