Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна помощь с проектированием базы / 25 сообщений из 40, страница 1 из 2
29.03.2016, 14:17
    #39203217
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Мужики, чет я затупил. Помогите советом. Нужно задокументировать вот такой анализ бак. посева с чувствительностью к антибиотикам
примерно так

сделал так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
-- табля с пациентами

CREATE TABLE TBL_PATIENTS (
    PAT_ID    INTEGER NOT NULL,
    PAT_NAME  VARCHAR(10)
);

//============================
-- табля с видами бактерий

CREATE TABLE TBL_BACTERIA (
    BACT_ID    INTEGER NOT NULL,
    BACT_NAME  VARCHAR(10)
);

ALTER TABLE TBL_BACTERIA ADD CONSTRAINT PK_TBL_BACTERIA PRIMARY KEY (BACT_ID);
ALTER TABLE TBL_PATIENTS ADD CONSTRAINT PK_TBL_PATIENTS PRIMARY KEY (PAT_ID);

//============================
-- табля с лекарствами, на которые будет определяться чувствительность

CREATE TABLE TBL_DRUG (
    DRUG_ID    INTEGER NOT NULL,
    DRUG_NAME  VARCHAR(10)
);

ALTER TABLE TBL_DRUG ADD CONSTRAINT PK_TBL_DRUG PRIMARY KEY (DRUG_ID);

//============================
-- табля с видами бак.посева (по названию сред, из которых забирается материал)

CREATE TABLE TBL_CULTURE (
    CULT_ID          INTEGER NOT NULL,
    CULT_DATE        TIMESTAMP NOT NULL,
    CULT_NAME        VARCHAR(100) NOT NULL,
    CULT_FK_BACT     INTEGER NOT NULL,
    CULT_FK_DRUG     INTEGER NOT NULL,
    CULT_FK_PAT      INTEGER NOT NULL,
    CULT_VALUE_BACT  INTEGER, -- концентрация в виде десятичного lg
    CULT_VALUE_DRUG  SMALLINT DEFAULT 0 NOT NULL -- значения: устойчива, условно устойчива, чувствительна 
);

ALTER TABLE TBL_CULTURE ADD CHECK (CULT_VALUE_DRUG in (-1,0,1));
ALTER TABLE TBL_CULTURE ADD CONSTRAINT PK_TBL_CULTURE PRIMARY KEY (CULT_ID);


ALTER TABLE TBL_CULTURE ADD CONSTRAINT FK_TBL_CULTURE_1 FOREIGN KEY (CULT_FK_BACT) REFERENCES TBL_BACTERIA (BACT_ID);
ALTER TABLE TBL_CULTURE ADD CONSTRAINT FK_TBL_CULTURE_2 FOREIGN KEY (CULT_FK_DRUG) REFERENCES TBL_DRUG (DRUG_ID);
ALTER TABLE TBL_CULTURE ADD CONSTRAINT FK_TBL_CULTURE_3 FOREIGN KEY (CULT_FK_PAT) REFERENCES TBL_PATIENTS (PAT_ID);


Но что-то подсказывает, что можно сделать лучше. Есть мысли какие?

=================
Док.

Win7 Ultim x64, Deb 7.6 i386 (Deb 8.3 i386): FB 2.5.5.26952, диалект 3, SS(win)/CS(Deb), Lazarus 1.7; FPC 3.1.1, IBX by -Rik-
...
Рейтинг: 0 / 0
29.03.2016, 14:28
    #39203245
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
ДокПо сабжу есть мысли?
Сабж ништяк в первом приближении. Для повышения нормальности можно ссылку на пациента и
место стера вынести в отдельную таблицу проб (или анализов), а из результатов ссылаться
уже на неё, но это сугубо мелочь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.03.2016, 14:42
    #39203260
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Док
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE TBL_CULTURE (
    CULT_ID          INTEGER NOT NULL,
    CULT_DATE        TIMESTAMP NOT NULL,
    CULT_NAME        VARCHAR(100) NOT NULL,
    CULT_FK_BACT     INTEGER NOT NULL,
    CULT_FK_DRUG     INTEGER NOT NULL,
    CULT_FK_PAT      INTEGER NOT NULL,
    CULT_VALUE_BACT  INTEGER, -- концентрация в виде десятичного lg
    CULT_VALUE_DRUG  SMALLINT DEFAULT 0 NOT NULL -- значения: устойчива, условно устойчива, чувствительна 
);


Это та самая справка? На каждую строку и имя и дата?
...
Рейтинг: 0 / 0
29.03.2016, 14:59
    #39203287
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Док,

не делай префиксы у столбцов. это лишнее.
...
Рейтинг: 0 / 0
29.03.2016, 15:09
    #39203297
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
wadmanНа каждую строку и имя и дата?
Тут неясно имя и дата чего. Имя явно не пациента и не лекарства. Дата тоже может быть не
взятия анализа, а получения результата по каждому лекарству отдельно (хотя в бланке её и нет).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.03.2016, 15:19
    #39203308
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
мы еще традиционно пишем current_timestamp и current_user в каждую таблицу, просто триггером на инсерт, на всякий случай, бывает помогает при разборе полетов.

kdvне делай префиксы у столбцов. это лишнее.Особенно, когда на автомате пишешь запросы вида алиас.стобец префиксы будут дублироваться и пестрить.
...
Рейтинг: 0 / 0
29.03.2016, 15:27
    #39203319
miwaonline
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Ivan_Pisarevskyмы еще традиционно пишем current_timestamp и current_user в каждую таблицу, просто триггером на инсерт, на всякий случай, бывает помогает при разборе полетов.

+1
Только у нас полей четыре - create_ и change_ вместо одного current_.
...
Рейтинг: 0 / 0
29.03.2016, 17:48
    #39203489
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
kdvне делай префиксы у столбцов. это лишнее.
да, Дим. Привычка дурная осталась. Надо бы переделать, заодно "лишнее место" в названии освободится - иногда 31 знака не хватает.

wadmanНа каждую строку и имя и дата?
собственно, я ничего логичнее не придумал. Предложишь что-то более феншуйное - буду только благодарен :)

Dimitry SibiryakovТут неясно имя и дата чего. Имя явно не пациента и не лекарства.
пока подразумевается дата изготовления (забора) анализа.

Дим, а ты что конкретно имел ввиду под этим?
авторДля повышения нормальности можно ссылку на пациента и место стера вынести в отдельную таблицу проб (или анализов), а из результатов ссылаться уже на неё
...
Рейтинг: 0 / 0
29.03.2016, 17:55
    #39203498
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Докпока подразумевается дата изготовления (забора) анализа.
Тогда тебе действительно нужна отдельная таблица анализов типа такой: (ссылка на пациента,
ссылка на бактерию, дата и прочая ботва). И отдельная таблица результатов отдельных тестов
для этих анализов: (ссылка на анализ, ссылка на препарат, флаг устойчивости).

Это опять же если одним анализом не производится тестирование сразу нескольких бактерий.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.03.2016, 18:25
    #39203532
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table analiz (id integer not null primary key,
   poc integer not null references pocient (id), -- у кого отобрали
   name varchar (100), -- из какого места
   kogda date, -- когда отобрали
   bak integer not null references bakterii (id), -- что за зверушка
   konc integer); -- концентрация бактерии

create table ustoj (anal integer not null references analiz (id),
   drug integer not null references drugs (id), -- чем мучили
   nox integer not null check value in (0,1,2)); -- насколько зверушке пох


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.03.2016, 12:01
    #39203977
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Hello, Miwaonline!
You wrote on 30 марта 2016 г. 11:59:42:

Miwaonline> +1
> Только у нас полей четыре - create_ и change_ вместо одного current_.аналогично.
но у нас есть ещё и "самоархивирующиеся" таблицы, на которые сверху навешена вьюха показывающая "актуальное состояние"

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.03.2016, 13:07
    #39204037
DelphiCoder_1980
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Это ты делаешь чисто для лаборатории или для электронной истории? Удивило, зачем тут название среды. Надо учесть, какой питательный раствор был в пробирке с материалом?
...
Рейтинг: 0 / 0
30.03.2016, 13:49
    #39204104
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Док, на всякий случай сделал, может в будущем мне самому пригодится.
Триггеры делать не стал, пока лениво.
Справочники - схематично. Если что не понятно - обсудим.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
CREATE DOMAIN DX AS INTEGER NOT NULL;
CREATE DOMAIN DX0 AS INTEGER DEFAULT 0 NOT NULL;
COMMENT ON DOMAIN DX0 IS 'Для ссылки на справочники, в которых есть пустое значение как вариант выбора';

CREATE DOMAIN STRING10 AS VARCHAR(10) CHARACTER SET WIN1251 COLLATE WIN1251;
CREATE DOMAIN STRING25 AS VARCHAR(25) CHARACTER SET WIN1251 COLLATE WIN1251;
CREATE DOMAIN STRING30 AS VARCHAR(30) CHARACTER SET WIN1251 COLLATE WIN1251;
CREATE DOMAIN STRING70 AS VARCHAR(70) CHARACTER SET WIN1251 COLLATE WIN1251;
CREATE DOMAIN BOOLEAN AS SMALLINT DEFAULT 0 CHECK (VALUE BETWEEN 0 AND 1);
CREATE DOMAIN DTS AS TIMESTAMP DEFAULT current_timestamp;

CREATE TABLE PERSONNEL (
    XPERSONNEL  DX,
    FAMILY      STRING30 NOT NULL,
    NAME        STRING25 NOT NULL 
);
ALTER TABLE PERSONNEL ADD PRIMARY KEY (XPERSONNEL);
COMMENT ON TABLE PERSONNEL IS 'Персонал';

CREATE TABLE PATIENT (
    XPATIENT  DX,
    FAMILY      STRING30 NOT NULL,
    NAME        STRING25 NOT NULL 
);
ALTER TABLE PATIENT ADD PRIMARY KEY (XPATIENT);
COMMENT ON TABLE PATIENT IS 'Пациент';


CREATE TABLE CASERECORD (
    XCASERECORD     DX,
    XBRANCH         DX /* DX = INTEGER NOT NULL */,
    XPATIENT        DX /* DX = INTEGER NOT NULL */);
ALTER TABLE CASERECORD ADD CONSTRAINT PK_CASERECORD PRIMARY KEY (XCASERECORD);
COMMENT ON TABLE CASERECORD IS 'История болезни';

CREATE TABLE GERMICIDE (
    XGERMICIDE  DX /* DX = INTEGER NOT NULL */,
    NAME        STRING25 /* STRING25 = VARCHAR(25) */,
    NAMELATIN   STRING30 /* STRING30 = VARCHAR(30) */
);
ALTER TABLE GERMICIDE ADD CONSTRAINT PK_GERMICIDE PRIMARY KEY (XGERMICIDE);
COMMENT ON TABLE GERMICIDE IS 'Бактерицид';

CREATE TABLE TESTGERMICIDE (
    XTESTGERMICIDE  DX /* DX = INTEGER NOT NULL */,
    NAME            STRING30 /* STRING30 = VARCHAR(30) */,
    USE             BOOLEAN /* BOOLEAN = SMALLINT DEFAULT 0 CHECK(VALUE BETWEEN 0 AND 1) */
);
ALTER TABLE TESTGERMICIDE ADD CONSTRAINT PK_TESTGERMICIDE PRIMARY KEY (XTESTGERMICIDE);
COMMENT ON TABLE TESTGERMICIDE IS 'Бактериологический тест';

CREATE TABLE TESTGERMICIDE$GERMICIDE (
    XTESTGERMICIDE$GERMICIDE  DX /* DX = INTEGER NOT NULL */,
    XTESTGERMICIDE            DX /* DX = INTEGER NOT NULL */,
    XGERMICIDE                DX /* DX = INTEGER NOT NULL */
);
ALTER TABLE TESTGERMICIDE$GERMICIDE ADD CONSTRAINT PK_TESTGERMICIDE$GERMICIDE PRIMARY KEY (XTESTGERMICIDE$GERMICIDE);
ALTER TABLE TESTGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTGERMICIDE$GERMICIDE_1 FOREIGN KEY (XTESTGERMICIDE) REFERENCES TESTGERMICIDE (XTESTGERMICIDE);
ALTER TABLE TESTGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTGERMICIDE$GERMICIDE_2 FOREIGN KEY (XGERMICIDE) REFERENCES GERMICIDE (XGERMICIDE);
COMMENT ON TABLE TESTGERMICIDE$GERMICIDE IS 'Список агентов, входящих в тест';

CREATE TABLE BACTERIUM (
    XBACTERIUM  DX /* DX = INTEGER NOT NULL */,
    NAME        STRING25 /* STRING25 = VARCHAR(25) */,
    NAMELATIN   STRING30 /* STRING30 = VARCHAR(30) */
);
ALTER TABLE BACTERIUM ADD CONSTRAINT PK_BACTERIUM PRIMARY KEY (XBACTERIUM);
COMMENT ON TABLE BACTERIUM IS 'Бактерии';

CREATE TABLE ENVIRONMENT (
    XENVIRONMENT  DX /* DX = INTEGER NOT NULL */,
    NAME          STRING25 /* STRING25 = VARCHAR(25) */,
    NAMELATIN     STRING30 /* STRING30 = VARCHAR(30) */
);
ALTER TABLE ENVIRONMENT ADD CONSTRAINT PK_ENVIRONMENT PRIMARY KEY (XENVIRONMENT);
COMMENT ON TABLE ENVIRONMENT IS 'Среда обитания бактерий';

CREATE TABLE TESTINGGERMICIDE (
    XTESTINGGERMICIDE  DX /* DX = INTEGER NOT NULL */,
    XTESTGERMICIDE     DX /* DX = INTEGER NOT NULL */,
    XPATIENT           DX /* DX = INTEGER NOT NULL */,
    XCASERECORD        DX0 /* DX0 = INTEGER DEFAULT 0 NOT NULL */,
    XPERSONNEL         DX /* DX = INTEGER NOT NULL */,
    XBACTERIUM         DX /* DX = INTEGER NOT NULL */,
    XENVIRONMENT       DX /* DX = INTEGER NOT NULL */,
    TS                 DTS /* DTS = TIMESTAMP DEFAULT 'NOW' */,
    RESULT             STRING70 /* STRING70 = VARCHAR(70) */
);
ALTER TABLE TESTINGGERMICIDE ADD CONSTRAINT PK_TESTINGGERMICIDE PRIMARY KEY (XTESTINGGERMICIDE);
ALTER TABLE TESTINGGERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE_1 FOREIGN KEY (XTESTGERMICIDE) REFERENCES TESTGERMICIDE (XTESTGERMICIDE);
ALTER TABLE TESTINGGERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE_2 FOREIGN KEY (XPATIENT) REFERENCES PATIENT (XPATIENT);
ALTER TABLE TESTINGGERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE_3 FOREIGN KEY (XCASERECORD) REFERENCES CASERECORD (XCASERECORD);
ALTER TABLE TESTINGGERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE_4 FOREIGN KEY (XPERSONNEL) REFERENCES PERSONNEL (XPERSONNEL);
ALTER TABLE TESTINGGERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE_5 FOREIGN KEY (XBACTERIUM) REFERENCES BACTERIUM (XBACTERIUM);
ALTER TABLE TESTINGGERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE_6 FOREIGN KEY (XENVIRONMENT) REFERENCES ENVIRONMENT (XENVIRONMENT);
COMMENT ON TABLE TESTINGGERMICIDE IS 'Бактериологическое исследование материала пациента';
COMMENT ON COLUMN TESTINGGERMICIDE.XTESTGERMICIDE IS 'Ссылка на тест';
COMMENT ON COLUMN TESTINGGERMICIDE.XPATIENT IS 'Ссылка на пациента';
COMMENT ON COLUMN TESTINGGERMICIDE.XCASERECORD IS 'Ссылка на историю болезни, если есть';
COMMENT ON COLUMN TESTINGGERMICIDE.XPERSONNEL IS 'Ссылка на персонал (лаборант)';
COMMENT ON COLUMN TESTINGGERMICIDE.XBACTERIUM IS 'Ссылка на иссл. бактерию';
COMMENT ON COLUMN TESTINGGERMICIDE.XENVIRONMENT IS 'Ссылка на среду обитания бактерии';

CREATE TABLE TESTINGGERMICIDE$GERMICIDE (
    XTESTINGGERMICIDE$GERMICIDE  DX /* DX = INTEGER NOT NULL */,
    XTESTINGGERMICIDE            DX /* DX = INTEGER NOT NULL */,
    XGERMICIDE                   DX /* DX = INTEGER NOT NULL */,
    RESULT                       STRING10 /* STRING10 = VARCHAR(10) */
);
ALTER TABLE TESTINGGERMICIDE$GERMICIDE ADD CONSTRAINT PK_TESTINGGERMICIDE$GERMICIDE PRIMARY KEY (XTESTINGGERMICIDE$GERMICIDE);
ALTER TABLE TESTINGGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE$GERMICIDE_1 FOREIGN KEY (XTESTINGGERMICIDE) REFERENCES TESTINGGERMICIDE (XTESTINGGERMICIDE);
ALTER TABLE TESTINGGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTINGGERMICIDE$GERMICIDE_2 FOREIGN KEY (XGERMICIDE) REFERENCES GERMICIDE (XGERMICIDE);
COMMENT ON COLUMN TESTINGGERMICIDE$GERMICIDE.XGERMICIDE IS 'Ссылка на антибиотик';
COMMENT ON COLUMN TESTINGGERMICIDE$GERMICIDE.RESULT IS 'Результат воздействия антибиотика';

SET TERM ^ ;
CREATE OR ALTER TRIGGER TESTINGGERMICIDE_BD FOR TESTINGGERMICIDE
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  delete from testinggermicide$germicide tg where tg.xtestinggermicide=old.xtestinggermicide;
end
^
SET TERM ; ^

SET TERM ^ ;
CREATE OR ALTER TRIGGER TESTGERMICIDE_BD FOR TESTGERMICIDE
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  delete from testgermicide$germicide tg where tg.xtestgermicide=old.xtestgermicide;
end
^
SET TERM ; ^


...
Рейтинг: 0 / 0
30.03.2016, 14:16
    #39204161
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
kdvzeon11CREATE DOMAIN STRING25 AS VARCHAR(25) CHARACTER SET WIN1251 COLLATE WIN1251;
CREATE DOMAIN STRING30 AS VARCHAR(30) CHARACTER SET WIN1251 COLLATE WIN1251;
потрясающе - string25, string30... а кстати, у вас что, дефолтный чарсет базы не win1251?

Ваш вариант?
...
Рейтинг: 0 / 0
30.03.2016, 15:15
    #39204234
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
zeon11Ваш вариант?

Сделать один домен с запасом типа VARCHAR(100).
...
Рейтинг: 0 / 0
30.03.2016, 16:21
    #39204317
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
zeon11Ваш вариант?
накой они нужны? т.е., с какой целью сделаны?
Вы и в Дельфи так же пишете? Вместо
var s: string
надо сначала накатать
Код: pascal
1.
2.
3.
type
 string20 = string[20];
 string30 = string[30]; 


и так далее?

Вот тут только что говорили про домены
http://www.sql.ru/forum/1207166/fb3-neponyatka
...
Рейтинг: 0 / 0
30.03.2016, 16:36
    #39204329
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
zeon11,

кстати, я замечу, что
Код: sql
1.
    NAME            STRING30 /* STRING30 = VARCHAR(30) */,


комментарий с расшифровкой домена в IBExpert появился по моей просьбе (как минимум). Невозможно было смотреть DDL чужих баз с массой доменов непонятного назначения.
string30 это еще туда-сюда, понятно что это. Но с другой стороны, такой домен совершенно бессмысленен - ведь ясно, что разработчик дальше не будет навешивать на него check или еще что-либо.
Единственный смысл домена string30 - возможность выполнить в дальнейшем alter domain string30 to string40 type varchar(40). Что может также вызвать проблемы, если части столбцов типа string30 не требуется увеличение размера.
...
Рейтинг: 0 / 0
30.03.2016, 17:20
    #39204369
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
kdvzeon11,

кстати, я замечу, что
Код: sql
1.
    NAME            STRING30 /* STRING30 = VARCHAR(30) */,


комментарий с расшифровкой домена в IBExpert появился по моей просьбе (как минимум). Невозможно было смотреть DDL чужих баз с массой доменов непонятного назначения.
string30 это еще туда-сюда, понятно что это. Но с другой стороны, такой домен совершенно бессмысленен - ведь ясно, что разработчик дальше не будет навешивать на него check или еще что-либо.
Единственный смысл домена string30 - возможность выполнить в дальнейшем alter domain string30 to string40 type varchar(40). Что может также вызвать проблемы, если части столбцов типа string30 не требуется увеличение размера.

Да, комментарии в IBExpert очень удобны. Если Вы приложили к этому руку - то и от меня тоже спасибо.
По поводу string30 и т.п. - всё дело в процедурах. бывает так, (ну, по крайней мере у меня), что не угадаешь с размером поля, приходится его увеличивать, при этом это поле "вошло" уже в кучу процедур. Что-бы не получить исключения в неподходящий момент, пробегаюсь по метаданным, где переменные так-же описаны с помощью соответствующих доменов, и меняю размер переменных в процедурах.
Можно конечно, как посоветовал DarkMaster делать всё с запасом, тем более это ни чем не грозит, но пока что для меня это некоторый дискомфорт. Мы же носим старые джинсы не потому, что не можем купить новые. Просто в старых нам удобнее. :-)

Кстати, думал меня начнут клевать за использование префикса "X" вместо суффикса "_ID" в ключевых полях, но как-то обошлось. Или ещё не вечер?
...
Рейтинг: 0 / 0
30.03.2016, 17:26
    #39204382
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
zeon11,

да по фиг на твою систему префиксов. Мне вот доллар в именах таблиц и столбцов не нравится, но тоже ничего страшного. А вот неосмысленные имена FK уже хуже

Код: sql
1.
2.
3.
4.
ALTER TABLE TESTGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTGERMICIDE$GERMICIDE_1 
FOREIGN KEY (XTESTGERMICIDE) REFERENCES TESTGERMICIDE (XTESTGERMICIDE);
ALTER TABLE TESTGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTGERMICIDE$GERMICIDE_2 
FOREIGN KEY (XGERMICIDE) REFERENCES GERMICIDE (XGERMICIDE);



потом начнёшь разбирать план запроса, а он тебе имена индексов FK_TESTGERMICIDE$GERMICIDE_2 даст и гадай к какому филду это относится
...
Рейтинг: 0 / 0
30.03.2016, 18:15
    #39204430
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Симонов Денисzeon11,

да по фиг на твою систему префиксов. Мне вот доллар в именах таблиц и столбцов не нравится, но тоже ничего страшного. А вот неосмысленные имена FK уже хуже

Код: sql
1.
2.
3.
4.
ALTER TABLE TESTGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTGERMICIDE$GERMICIDE_1 
FOREIGN KEY (XTESTGERMICIDE) REFERENCES TESTGERMICIDE (XTESTGERMICIDE);
ALTER TABLE TESTGERMICIDE$GERMICIDE ADD CONSTRAINT FK_TESTGERMICIDE$GERMICIDE_2 
FOREIGN KEY (XGERMICIDE) REFERENCES GERMICIDE (XGERMICIDE);



потом начнёшь разбирать план запроса, а он тебе имена индексов FK_TESTGERMICIDE$GERMICIDE_2 даст и гадай к какому филду это относится

В своё оправдание назову одно число - "31".
...
Рейтинг: 0 / 0
30.03.2016, 18:17
    #39204437
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
zeon11,

вот поэтому и не надо делать очень длинных имён таблиц, и имён столбцов в которых имя этой таблицы повторяется
...
Рейтинг: 0 / 0
30.03.2016, 18:47
    #39204469
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Мимопроходящий"самоархивирующиеся" таблицы, на которые сверху навешена вьюха показывающая "актуальное состояние"А апдейт тоже через вьюху делаете или напрямую? Или SP ?
...
Рейтинг: 0 / 0
30.03.2016, 19:03
    #39204485
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Симонов Денисzeon11,

вот поэтому и не надо делать очень длинных имён таблиц, и имён столбцов в которых имя этой таблицы повторяется

А вот тут не соглашусь. Был у меня период коротких имён. А потом как-то пришло понимание, что нормальные имена - лучше.
Почему "X" а не "_ID" - экономия 2 символа и скорость при написании JOINов.
Почему $ - Документ$ТаблицаДокумента. Легко вспомнить, легко искать, легко связывать. Скорость написания запросов с клавиатуры гораздо выше.
Как-то так.
...
Рейтинг: 0 / 0
30.03.2016, 19:13
    #39204489
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Симонов Денис,

Код: sql
1.
ALTER TABLE TESTGERMICIDE$GERMICIDE ... REFERENCES TESTGERMICIDE


по-моему, тут можно убиться об стену. Если кто не понял, я про имена таблиц
TESTGERMICIDE$GERMICIDE->TESTGERMICIDE
ну и
GERMICIDE.XGERMICIDE
это тоже капец какой-то. Еще хуже только это

Код: sql
1.
2.
CREATE TABLE TESTGERMICIDE$GERMICIDE (
    XTESTGERMICIDE$GERMICIDE ...



может быть, для русскоязычных английские буквы как-то скрывают бессмысленность. Но если по русски сделать
создать таблицу тестидентификатор$идентификатор(
хтестидентификатор$идентификатор
то думаю, моя мысль будет более понятна :-)
Остается пожелать развить эту тему дальше, типа,
хидентификатор$тестидентификатор#хтестидентификатор
...
Рейтинг: 0 / 0
30.03.2016, 21:01
    #39204556
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с проектированием базы
Я понимаю Ваше негодование на нечитаемые имена, но обратите внимание, для правильного описания ОДНОГО медицинского документа (очень не сложного, смею заметить, Док привёл 1 фотографию) и работы с этим документом (надеюсь, по нормализации, ссылочной целостности претензий нет?), потребовалось 10 таблиц. Серьёзная МИС (медицинская информационная система) должна описывать несколько десятков, а то и сотен таких документов. В этом случае регрессионное именование объектов приведёт к путанице, грубым ошибкам, когда в запросах будут ошибочно связываться не те таблицы. Поэтому таблицы с названиями "BOLNOY", "ANALIZKROVI", "LEKARSTVO" и т.п. давно умерли.
Приведу ещё пример, из другой области, а именно химии. Именование соединений вначале было достаточно простым. Бензол, толуол, индиго и т.д. По мере развития, число соединений стремительно росло (сейчас описано несколько миллионов соединений), и пришлось, не от хорошей жизни, выработать специальную систему именования веществ, однозначно трактующую структуру вещества. Т.е. по названию вещества, приводящего простого смертного в ступор, химик без каких-либо затруднений может однозначно нарисовать структуру этого вещества и рассказать о многих его химических свойствах. Например, N,N-диметил-N,N-диаллиламмоний хлорид - вполне себе изящная симметричная молекула способная к радикальной полимеризации и сополимеризации с образованием водорастворимого полимера. :-)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна помощь с проектированием базы / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]