SQL Design: представление значения по умолчанию с переопределениями? - PullRequest
1 голос
/ 27 апреля 2010

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

Например, если значение по умолчанию 17, то foo, bar, baz будет иметь значения 17,21,17:

table "things"   table "xvalue"
name  stuff      name xval
----  -----      ---- ----
 foo  ...         bar   21
 bar  ...
 baz  ...

Если мне наплевать на ФК из xvalue.name -> things.name, я могу просто поставить название "DEFAULT":

                 table "xvalue"
                 name xval
                 ---- ----
              DEFAULT   17
                  bar   21

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

                 table "xvalue_default"
                      xval
                      ----
                        17

                 table "xvalue"
                 name xval
                 ---- ----
                  bar   21

Я мог бы иметь "таблицу значений по умолчанию"

            tablename  attributename  defaultvalue
               xvalue           xval            17

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

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

Как лучше всего это представить, включая значение по умолчанию? Это будет для Oracle 10.2, если это имеет значение.

Ответы [ 5 ]

1 голос
/ 27 апреля 2010

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

SQL> create table t34 (
  2    id number not null
  3    , col1 varchar2(30) default user
  4    , col2 date default sysdate
  5    , col3 char(1) default 'N' )
  6  /

Table created.

SQL>

Эти значения применяются автоматически, если мы ничего не указываем:

SQL> insert into t34
  2      (id)
  3  values
  4      (1)
  5  /

1 row created.

SQL>

В качестве альтернативы, если мы хотим указать некоторые значения, но не другие, мы можем использовать ключевое слово DEFAULT

SQL> insert into t34
  2  values
  3      (2, null, default, 'Y')
  4  /

1 row created.

SQL> select * from t34
  2  /

        ID COL1                           COL2      C
---------- ------------------------------ --------- -
         1 APC                            27-APR-10 N
         2                                27-APR-10 Y

SQL>

Мы можем найти значения по умолчанию в представлении словаря данных USER_TAB_COLUMNS. К сожалению, DATA_DEFAULT относится к отвратительному типу данных LONG, что снижает его удобство использования.

SQL> select column_name, data_default
  2  from user_tab_columns
  3  where table_name = 'T34'
  4  /

COLUMN_NAME                    DATA_DEFAULT
------------------------------ ------------------------------
ID
COL1                           user
COL2                           sysdate
COL3                           'N'

SQL>

Переопределить значения

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

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

0 голосов
/ 26 августа 2011

Сначала используйте значение по умолчанию для определений столбцов.

Если по какой-то причине вы не можете этого сделать, выполните одно из следующих действий:

  1. создайте дубликат вашей табличной структуры, который содержит одну запись, содержащую ваши значения по умолчанию. При вставке объедините данные в этой таблице с данными, которые вы передали. (самый тяжелый из 3).
  2. написать триггер и обработать его там
  3. если все вставки / обновления недоступны из-за хранимых процедур (моя обычная рекомендация), тогда обработайте это в вашем процессе
  4. если вы создаете sql в коде, см. Самую первую строку этого ответа.

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

0 голосов
/ 27 апреля 2010

Это делает то, что вы собираетесь?

SELECT TABLE_NAME, STUFF, NVL(XVAL, 17) XVAL
FROM THINGS, XVALUE
WHERE THINGS.TABLE_NAME(+) = XVALUE.TABLE_NAME
0 голосов
/ 27 апреля 2010

Я полагаю, что триггер - лучший способ обработки сложных бизнес-правил, подобных этому. Просто убедитесь, что вы настроили (и протестировали) его работу, когда кто-то вставляет или обновляет несколько строк одним действием.

0 голосов
/ 27 апреля 2010

Как насчет использования представления? В этом представлении вы выполняете внешнее соединение с таблицей xvalue, а затем используете функцию coalesce для возврата значения по умолчанию, если xval имеет значение null.

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