Я решил бы это, как описано Томасом М. Дюбусоном. Поскольку мы хотим, чтобы концы списка «подсчитывались», мы добавим отрицательные бесконечности к каждому концу, прежде чем создавать тройки. Пакет monoid-extras обеспечивает подходящий тип для этого.
import Data.Monoid.Inf
pad :: [a] -> [NegInf a]
pad xs = [negInfty] ++ map negFinite xs ++ [negInfty]
triples :: [a] -> [(a, a, a)]
triples (x:rest@(y:z:_)) = (x,y,z) : triples rest
triples _ = []
isBig :: Ord a => (a,a,a) -> Bool
isBig (x,y,z) = y > x && y > z
scnd :: (a, b, c) -> b
scnd (a, b, c) = b
finites :: [Inf p a] -> [a]
finites xs = [x | Finite x <- xs]
largest :: Ord a => [a] -> [a]
largest = id
. finites
. map scnd
. filter isBig
. triples
. pad
Кажется, что он работает надлежащим образом; в ghci:
> largest [0,1,5,2,3,7,8,4]
[5,8]
> largest [10,1,10]
[10,10]
> largest [3]
[3]
> largest []
[]
Вы можете также рассмотреть возможность объединения finites
, map scnd
и filter isBig
в одном понимании списка (затем исключая определения finites
, scnd
и isBig
):
largest :: Ord a => [a] -> [a]
largest xs = [x | (a, b@(Finite x), c) <- triples (pad xs), a < b, c < b]
Но мне нравится разложенная версия лучше; функции finites
, scnd
и isBig
могут оказаться полезными в других местах вашего развития, особенно если вы планируете построить несколько вариантов этого для разных нужд.
Проверьте ответ, который я дал здесь
Свободное сопоставление «один-к-одному» NHibernate с синтетическими ключами
Я склоняюсь к методу # 1 (единая таблица разделов), ради эффективного извлечения целых политик со всеми их разделами (что я предполагаю, что ваша система будет делать много).
Кроме того, Я не знаю, какую версию SQL Server вы используете, но в 2008 году Sparse Columns помогают оптимизировать производительность в ситуациях, когда многие значения в столбце будут NULL.
В конечном итоге вам нужно будет решить, насколько «похожие» разделы политики. Если они не будут существенно различаться, я думаю, что более нормализованное решение может быть более сложным, чем это стоит ... но только вы можете сделать этот звонок. :)
Третий вариант - создать таблицу «Политика», а затем таблицу «SectionsMain», которая хранит все поля, которые являются общими для типов разделов. Затем создайте другие таблицы для каждого типа разделов, которые содержат только те поля, которые не являются общими.
Решение, которое лучше всего зависит в основном от того, сколько полей у вас есть и как вы хотите написать свой SQL. Все будут работать. Если у вас всего несколько полей, я, вероятно, поеду с №1. С «лотами» полей я бы наклонился к № 2 или № 3.
Другой способ сделать это, используя компонент INHERITS
. Например:
CREATE TABLE person (
id int ,
name varchar(20),
CONSTRAINT pessoa_pkey PRIMARY KEY (id)
);
CREATE TABLE natural_person (
social_security_number varchar(11),
CONSTRAINT pessoaf_pkey PRIMARY KEY (id)
) INHERITS (person);
CREATE TABLE juridical_person (
tin_number varchar(14),
CONSTRAINT pessoaj_pkey PRIMARY KEY (id)
) INHERITS (person);
Таким образом, можно определить наследование между таблицами.
С предоставленной информацией я бы смоделировал базу данных следующим образом:
... и т. д., потому что я ожидаю, что будут разные атрибуты, связанные с каждый раздел политики. В противном случае может быть одна таблица SECTIONS
, а в дополнение к policy_id
будет section_type_code
...
В любом случае это позволит вам поддерживать необязательные разделы в политика ...
Я не понимаю, что вы считаете неудовлетворительным в отношении этого подхода - так вы храните данные, сохраняя ссылочную целостность, а не дублируя данные. Термин «нормирован» ...
Поскольку SQL основан на SET, он довольно чужд процедурным / OO-концепциям программирования и amp; требует перехода кода из одной области в другую. ORM часто рассматриваются, но они плохо работают в сложных, сложных системах.
Кроме того, в решении Daniel Vassallo, если вы используете SQL Server 2016, есть другое решение, которое я использовал в некоторых случаях без значительных потерь производительности.
Вы можете создать только таблицу с только общее поле и добавить один столбец с строкой JSON , которая содержит все определенные подтипы.
Я протестировал этот проект для управления наследованием, и я очень доволен гибкостью, которая Я могу использовать в относительном приложении.