Дизайн схемы базы данных - уникальные типы детей, один родительский [дубликат]

Я решил бы это, как описано Томасом М. Дюбусоном. Поскольку мы хотим, чтобы концы списка «подсчитывались», мы добавим отрицательные бесконечности к каждому концу, прежде чем создавать тройки. Пакет 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 могут оказаться полезными в других местах вашего развития, особенно если вы планируете построить несколько вариантов этого для разных нужд.

171
задан Eric Lavoie 18 June 2014 в 15:42
поделиться

6 ответов

347
ответ дан Community 3 September 2018 в 13:22
поделиться

Я склоняюсь к методу # 1 (единая таблица разделов), ради эффективного извлечения целых политик со всеми их разделами (что я предполагаю, что ваша система будет делать много).

Кроме того, Я не знаю, какую версию SQL Server вы используете, но в 2008 году Sparse Columns помогают оптимизировать производительность в ситуациях, когда многие значения в столбце будут NULL.

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

0
ответ дан Dan J 3 September 2018 в 13:22
поделиться

Третий вариант - создать таблицу «Политика», а затем таблицу «SectionsMain», которая хранит все поля, которые являются общими для типов разделов. Затем создайте другие таблицы для каждого типа разделов, которые содержат только те поля, которые не являются общими.

Решение, которое лучше всего зависит в основном от того, сколько полей у вас есть и как вы хотите написать свой SQL. Все будут работать. Если у вас всего несколько полей, я, вероятно, поеду с №1. С «лотами» полей я бы наклонился к № 2 или № 3.

12
ответ дан David 3 September 2018 в 13:22
поделиться

Другой способ сделать это, используя компонент 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);

Таким образом, можно определить наследование между таблицами.

4
ответ дан Marco Paulo Ollivier 3 September 2018 в 13:22
поделиться

С предоставленной информацией я бы смоделировал базу данных следующим образом:

ПОЛИТИКИ

  • POLICY_ID (первичный ключ)

ОБЯЗАТЕЛЬСТВА

  • LIABILITY_ID (первичный ключ)
  • POLICY_ID (внешний ключ)

СВОЙСТВА

  • PROPERTY_ID (первичный ключ)
  • POLICY_ID (внешний ключ)

... и т. д., потому что я ожидаю, что будут разные атрибуты, связанные с каждый раздел политики. В противном случае может быть одна таблица SECTIONS, а в дополнение к policy_id будет section_type_code ...

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

Я не понимаю, что вы считаете неудовлетворительным в отношении этого подхода - так вы храните данные, сохраняя ссылочную целостность, а не дублируя данные. Термин «нормирован» ...

Поскольку SQL основан на SET, он довольно чужд процедурным / OO-концепциям программирования и amp; требует перехода кода из одной области в другую. ORM часто рассматриваются, но они плохо работают в сложных, сложных системах.

8
ответ дан OMG Ponies 3 September 2018 в 13:22
поделиться

Кроме того, в решении Daniel Vassallo, если вы используете SQL Server 2016, есть другое решение, которое я использовал в некоторых случаях без значительных потерь производительности.

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

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

0
ответ дан overcomer 3 September 2018 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: