Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.23;
Скачать: CL | DM;

Вниз

FOREIGN KEY Обеспечение целоостности   Найти похожие ветки 

 
Борис   (2002-12-17 11:15) [0]

Уважаемые господа!
Есть N таблиц.

Одна главная:

CREATE TABLE "T_SKLAD"
(
"PKEY" INTEGER NOT NULL,
"NOMINAL" VARCHAR(250) CHARACTER SET WIN1251,
"TYPE_ELEM" VARCHAR(250) CHARACTER SET WIN1251,
"TYPE_ELEM_SVAZ" INTEGER,
"PRICE" INTEGER,
"POSTAVCHIK" INTEGER,
"PRIMECHANIE" VARCHAR(250) CHARACTER SET WIN1251,
"SROK_POSTAVKI" VARCHAR(250) CHARACTER SET WIN1251,
"OSTATOK" FLOAT,
"DEFICIT_NORM" INTEGER,
"ZAKAZAT" INTEGER,
"ZAKAZANO" INTEGER,
"OPLATIT" INTEGER,
"OPLACHENO" INTEGER,
"P1" INTEGER,
"P2" INTEGER,
"P3" INTEGER,
"P4" INTEGER,
"P5" INTEGER,
PRIMARY KEY ("PKEY")
);


И есть подчиненные таблицы (их много, но они одинаковые)
CREATE TABLE "T_NORM_1"
(
"PKEY" INTEGER NOT NULL,
"SECOND_KEY" INTEGER,
"NORMA" FLOAT,
"NORMA_NA_N" FLOAT,
"P1" FLOAT,
"P2" FLOAT,
"P3" FLOAT,
"P4" FLOAT,
"P5" FLOAT,
PRIMARY KEY ("PKEY")
);
ALTER TABLE "T_NORM_1" ADD FOREIGN KEY ("SECOND_KEY") REFERENCES T_SKLAD ("PKEY");


Задача - Обеспечетиь, чтобы для каждой строки в таблице T_SKLAD была своя строка в таблицах T_NORM_N (1..N) завязанная Первичный ключ T_SKLAD - Вторичный ключ SECOND_KEY T_NORM_N.


 
Romkin   (2002-12-17 11:21) [1]

Угу... приведи базу к третьей нормальной форме, и все пройдет...


 
Reindeer Moss Eater   (2002-12-17 11:23) [2]

Все как раз наеоборт.
Для каждой записи в T_NORM_1 должна быть строка в T_SKLAD


 
XM-AD   (2002-12-17 11:23) [3]

Не въехал...... Ты хочешь, чтобы при добавлении записи в t_sklad добавлялись записи во все таблицы t_norm_N???


 
Борис   (2002-12-17 11:27) [4]

Romkin
А как её привести к 3-й нормальной форме, чтобы небыло зависимостей между атрибутами (но не ключами)?

XM-AD
Да, именно этого и хотелось бы. Только вот как?


 
Reindeer Moss Eater   (2002-12-17 11:30) [5]

Да, именно этого и хотелось бы. Только вот как?

Триггер на вставку


 
Prooksius   (2002-12-17 11:31) [6]

2 Борис © (17.12.02 11:27)
Так в триггере after insert и добавляешь.


 
Romkin   (2002-12-17 11:37) [7]

/* Domain definitions */
CREATE DOMAIN DCOUNT AS NUMERIC(18, 4) /*Количество*/
default 1 NOT NULL;
CREATE DOMAIN DCURRENCY AS NUMERIC(15, 2) /*Цена*/
default 0 NOT NULL;
CREATE DOMAIN DLONGNAME AS VARCHAR(254) CHARACTER SET WIN1251;
CREATE DOMAIN DMASK AS CHAR(5) CHARACTER SET WIN1251;
CREATE DOMAIN DNAME AS VARCHAR(120) CHARACTER SET WIN1251;
CREATE DOMAIN DNOTES AS VARCHAR(4096) CHARACTER SET WIN1251;
CREATE DOMAIN DNUMBER AS VARCHAR(40) CHARACTER SET WIN1251;
CREATE DOMAIN DSHORTNAME AS VARCHAR(25) CHARACTER SET WIN1251;
CREATE DOMAIN DTYPE AS CHAR(5) CHARACTER SET WIN1251 NOT NULL;

/* Table: книга прихода-расхода (и резервирования), Owner: SYSDBA */

CREATE TABLE "ACCOUNTBOOK"
(
"ACCOUNTBOOK_ID" INTEGER NOT NULL,
"PARTY_NUM" INTEGER NOT NULL, /*Номер партии*/
"PARTY_YEAR" INTEGER NOT NULL, /*Год*/
"INOUT_SIGN" INTEGER default 1 NOT NULL, /*-1 - расход, 1 - приход, 0 - резерв*/
"PARTY_STATUS_ID" INTEGER default 1 NOT NULL,
"DATA" DATE DEFAULT "TODAY" NOT NULL, /*День движения*/
"BASE_TYPE" INTEGER, /*BASE - документ-основание*/
"BASE_NUM" "DNUMBER",
"BASE_DATE" DATE,
"MODEL_ID" INTEGER NOT NULL, /*Что за товар*/
"CLIENT_ID" INTEGER NOT NULL, /*от кого/кому*/
"COUNTNUM" "DCOUNT", /*кол-во*/
"UNIT_ID" INTEGER DEFAULT 1 NOT NULL, /*ед изм*/
"GARANTY" DATE, /*срок гарантии*/
"GCD_NUM" "DNUMBER",
"COUNTRY" "DNAME",
"ACT0" "DNUMBER",
"IN0" "DNUMBER",
"NOTES" "DNOTES",
"USER_ID" INTEGER,
CONSTRAINT "PK_ACCOUNT_BOOK" PRIMARY KEY ("ACCOUNTBOOK_ID")
);


 
Romkin   (2002-12-17 11:39) [8]

/* Table: Остатки по дням движения, Owner: SYSDBA */

CREATE TABLE "WH_REMAIN"
(
"MODEL_ID" INTEGER NOT NULL,
"REMAIN_COUNT" "DCOUNT",
"DATA" DATE DEFAULT "TODAY" NOT NULL,
CONSTRAINT "PK_WH_REMAIN" PRIMARY KEY ("MODEL_ID", "DATA")
);


 
Борис   (2002-12-17 11:54) [9]

Уважаемый Romkin!
Спасибо за приведение текста. Однако непонятно, как в данном случае можно обеспечить наличие строк в обеих таблицах?
Прошу, если возможно, объяснить.


 
Prooksius   (2002-12-17 12:16) [10]

2 Борис © (17.12.02 11:54)
Ты прямо хочешь чтобы за тебя и прогу написали, и базу составили.
Читай умные книжки. Твоих знаний пока недостаточно для этого.


 
Борис   (2002-12-17 12:30) [11]

Prooksius
Я не прошу, чтобы за меня что-то писали. я попросил Romkin-а чтобы он дал комментарии к приведенному тексту.

Реализацию с помощью тригера я представляю, но как я понял romkin приводит другой вариант? Или я не прав?


 
Romkin   (2002-12-17 12:37) [12]

create trigger Set_detail for table1T_SKLAD
after insert
as
begin
insert into T_NORM (...)
values (...);
end


 
Борис   (2002-12-17 12:54) [13]

Большое спасибо!
Как я понел надо:
пройтись по списку таблиц, в каждую добавить запись и все будет ОК.
Только вот как в данном тригере получить вводимы значения строчки из T_SKLAD?


 
Romkin   (2002-12-17 13:04) [14]

create trigger Set_detail for T_SKLAD
after insert
as
begin
insert into T_NORM (PKEY, Second_key, ...)
values (Gen_ID(...,1), NEW.PKEY); /* NEW - новое значение поля в T_Sklad */
end
А по моему коду - это просто аналог твоей таблицы T_Sklad, базу надо строить так, чтобы не приходилось писать такие триггеры


 
Борис   (2002-12-28 09:10) [15]

Есть один вопрос:
Имеется таблицы со списком названий предположим Таблиц норм.

Необходимо в тригере пройтись по этой таблице и вставить в каждую таблицу нормы новую строчку. Как это можно организовать?


 
Наталия   (2002-12-30 06:47) [16]

А не проще ли все однотипные таблицы норм преобразовать в одну таблицу с дополнительным полем "Норма"? Тем более, что судя по всему, количество этих таблиц не постоянно.


 
kaif   (2002-12-30 07:23) [17]

Наталия © (30.12.02 06:47)
Очень резонное замечание.


 
Борис   (2002-12-30 08:24) [18]

Наталия!
Вы знаете, так раньше и было сделано! Однако колчиство этих таблиц большое. На парадоксе не влезало в 255 столбцов, а сейчас их будет значительно больше!


 
Наталия   (2002-12-30 08:32) [19]

А зачем столько столбцов? :)
Ты таблицы объединяй "не в ширину" :), а "в глубину" :).
А в одном дополнительном поле "норма" указывать к какой таблице из перечня норм принадлежит данная запись.


 
Sergey13   (2002-12-30 08:37) [20]

2Борис © (30.12.02 08:24)
>На парадоксе не влезало в 255 столбцов, а сейчас их будет значительно больше!
Если не секрет, что за задача? Не часто встретишь, что бы 255 столбцов не зватало. Может консерваторию править надо. ИМХО, Наталия © (30.12.02 06:47) права.


 
Борис   (2002-12-30 09:00) [21]

Уважаемая Наталия и Сергей!
Опишу кратко проблему:
Имеется склад комплектующих. N позиций на склдае. N > 1000.
Имеются планы производства. Фактически это сколько единиц комплектующих выдано на каждую плату каждой продукции (в одной продукции N различных плат).
Имеются нормы (это сколько какой детали необходимо, чтобы собрать 1 плату). Имеется также незавершенка (это сколько выдано на данную плату в пределах плана). Т.е. можно запустить в производство сколько угодно планов.
И это все в различных таблица. В одной таблице склад. Потом таблица продукции. У каждой продукции свои платы. на каждую плату таблица с нормами (ссылка на комплектующие из главной таблицы и само значение нормы). + Для каждой платы сколько угодно незвершенок (это куда выдают комплектующие на плату).


 
Sergey13   (2002-12-30 09:26) [22]

Может я чего не понял, но ИМХО, есть над чем поурчать проектировщику. Например
>У каждой продукции свои платы. на каждую плату таблица с нормами

Это как? При разработке новой продукции - строится новая структура таблиц?


 
ЮЮ   (2002-12-30 09:30) [23]

Зато без Бориса никто не сможет начать производство новой продукции :-)


 
Delirium^.Tremens   (2002-12-30 09:33) [24]

Для того, чтобы у Бориса окончательно башню снесло, могу посоветовать посмотреть как это реализовано в 1С:Предприятии (конф. Производство+Услуги+Бухгалтерия).


 
Anatoly Podgoretsky   (2002-12-30 09:53) [25]

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


 
Delirium^.Tremens   (2002-12-30 09:55) [26]

2 Anatoly Podgoretsky © (30.12.02 09:53)

> Он уже этот вопрос задавал много месяцев назад, один к одному,
> тогда было дано много нормальных ответов.

:-) Сегодня, не то настроение, мастер.


 
Борис   (2002-12-30 10:19) [27]

Sergey
У одной продукции на платы одни нормы. А вот эту продуцию могут запускать в производство сколько угодно раз.

Delirium^.Tremens
А как реализовано в 1С?

Anatoly Podgoretsky
Вы обсолютно правы! И мной вынесено из той ветки (это было более года назад, тогда еще база была на Paradox-е, а сейчас необходимо реализовать на IB), что необходимо организовать именно в таком виде. Буду благодарен за советы по данному вопросу.

to All. Вопрос стоит ен в обсуждении структуры базы данных, а в конкретном вопросы:

Имеется таблицы со списком названий предположим Таблиц норм.

Необходимо в тригере пройтись по этой таблице и вставить в каждую таблицу нормы новую строчку (с определенными значениями). Как это можно организовать?


 
Alexandr   (2002-12-30 10:27) [28]

а не почитать тебе про "деревья в SQL"
хотябы на www.ibase.ru


 
Sergey13   (2002-12-30 10:43) [29]

2Борис © (30.12.02 10:19)
>У одной продукции на платы одни нормы. А вот эту продуцию могут запускать в производство сколько угодно раз.
И что? На каждый запуск новую таблицу? ИМХО, ты изобретаешь велосипед, но 1/2 колесный.

>to All. Вопрос стоит ен в обсуждении структуры базы данных
А жаль. ИМХО, тут то у тебя проблема как раз и есть.

>Как это можно организовать?
Наверное только через динамический SQL.

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


 
Борис   (2002-12-30 10:51) [30]

Sergey13

Создавать для каждого плана одну таблицу со списком выданных комплектующих и одну таблицу с нормами? Однако это значительно упростит работу.
Для каждой продукции список плат. На каждую продукцию делаем таблицу по нормам и планам. Будет значительно лучше. и таблиц станет меньше!


 
Наталия   (2002-12-30 11:01) [31]

Ты попытайся создать такую структуру БД, чтобы во время эксплуатации программы не приходилось создавать таблицы, а они были бы уже все созданы и их необходимо было бы только заполнять данными. Почитай книги по проектированию БД. У тебя, ИМХО, полная каша.


 
Борис   (2002-12-30 11:07) [32]

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


 
Наталия   (2002-12-30 11:16) [33]

Склад->Продукция связь 1:М
Продукция->Платы 1:М
Платы->Нормы 1:M
Вот вроде бы и всё в основных чертах, не нужно создавать дополнительные таблицы. Или я чего-то не понимаю?


 
Борис   (2002-12-30 11:23) [34]

Наталия
На складе лежат не готовые комплекты, а комплектующие!

Вот значения этих самых комплектующих мы и изменяем. На складе имеются значения наличия компл. на складе.

В нормах - сколько каждого комплектующего (из основной таблицы) необходимо для производства одной платы. ТЬак вот этих плат неопределенное количество. Акаждая плата относится к какой-либо продукции.

ИМХО, неизбежно для каждой продукции создавать таблицу норм. А для каждого плана таблицу "План" с незавершенкой.


 
Alexandr   (2002-12-30 11:27) [35]

так-с...
про деревья читать отказываемся...


 
Севостьянов Игорь   (2002-12-30 11:30) [36]

Удалено модератором


 
Alexandr   (2002-12-30 11:31) [37]

Удалено модератором


 
Наталия   (2002-12-30 11:35) [38]

Ну тогда
Продукция->Платы 1:М
Платы->Нормы 1:M
Комплектующие->Нормы 1:М
Комплектующие->Склад 1:М
И в чём проблема?


 
Delirium^.Tremens   (2002-12-30 11:39) [39]

2 Alexandr © (30.12.02 11:27)

> так-с...
> про деревья читать отказываемся...

Он и про RFunc2 доки читать не хотел, а пришлось ведь (наверно). Не обиделся ли он когда его к деревьям отправили?


 
Борис   (2002-12-30 11:51) [40]

кто нехотел читать? Да Вы и непредлагали. Путаите :) RFunc2

а Вот имхо, дошло:
Склад:
PKEY, Naimenovanie, Tip, Ostatok

Нормы:
PKEY, Product, Plata, Znachenie.

Тогда в Product уник. номер продукции, в Plata - уник. номер платы в пределах продукции.

И теперь при выборе платы и продукции делаем select * from
с условием product = номер продукции, плата = номер платы.

Вот мы выбрали один ко многим.
Получаем например:
T_SKLAD.NOminal, T_NORM.Znachenie

так если для значения T_SKLAD есть, а для него нет значения в таблице нормы. как быть? (В Access он автоматом добавляет поле в Нормы, а вот как это сделать в IB).



Страницы: 1 2 вся ветка

Текущий архив: 2003.01.23;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.009 c
9-72014
NailMan
2002-07-21 03:00
2003.01.23
Заточка игрушек


3-72147
ironwit
2002-12-26 10:18
2003.01.23
как проще всего отсортировать dbgrid по щелчку на колонке?


3-72035
Ig0r
2002-12-27 18:09
2003.01.23
Тип поля таблицы


9-72017
LM
2002-07-23 23:32
2003.01.23
Double to String


14-72476
Darkman
2003-01-05 21:59
2003.01.23
Tools API





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский