Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / База для сайта #2 / 25 сообщений из 57, страница 1 из 3
10.07.2010, 17:50
    #36734062
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
правильно?
...
Рейтинг: 0 / 0
10.07.2010, 23:02
    #36734292
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
В семнадцатой строке ошибка
...
Рейтинг: 0 / 0
11.07.2010, 03:57
    #36734456
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
SERG1257,

невижу, где?
...
Рейтинг: 0 / 0
11.07.2010, 05:32
    #36734461
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
авторневижу, где?Там где условия задачи
Я сильно сомневаюсь что вы это будете читать, но ссылку все же приведу
http://www.citforum.ru/howto/smart-questions-ru.shtml
...
Рейтинг: 0 / 0
11.07.2010, 06:17
    #36734463
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
полная картина происходящего
...
Рейтинг: 0 / 0
11.07.2010, 06:20
    #36734464
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
SERG1257,

Скажите пожалуйста я правильно спроектировал базу данных для сайта.
Если нет то прошу указать мне на мои ошибки и привести (по возможности) правильный пример.

Спасибо! ))
...
Рейтинг: 0 / 0
11.07.2010, 06:57
    #36734467
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
или с внешними ключами
...
Рейтинг: 0 / 0
11.07.2010, 07:02
    #36734468
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
авторСкажите пожалуйста я правильно спроектировал базу данных для сайта.Для этого надо достать условия задачи.
Попробую вам помочь.
Этап номер один: проводим логическое моделирование на словах, поэтому упрощаем донельзя.
Итак у нас есть некий сайт. У сайта есть список пользователей aka авторы.
Авторы могут принадлежать нулю, только одной, большому числу групп.
У каждого автора может быть ноль, один или несколько документов
У каждого документа может быть ноль, только одно, конечное число (максимум два, три, n) или бесконечно много описаний, ключевых слов, заголовков (нужное подчеркнуть)
Документы могут быть показаны в виде иерархии (документы в иерархии должны принадлежать одному автору или могут разным?)
Типичными запросами являются
поиск автора по логину
список документов одного автора
список документов по ключевым словам.
(добавьте)
какие запросы нужны для поддержания иерархии? Типа дай мне все документы подчиненные этому с уровнем вложения не более двух

Это для начала. Особо обращаю ваше внимание на четкое понимание - конечного числа ( ноль, только одна, не больше пяти ) против сколько угодно . Несмотря на соблазн объявить сколько угодно это означает введение дополнительной таблицы.
Например ограничив список ключевых слов десятью (пятнадцатью, двадцатью) вы избавляетесь от дополнительной таблицы и ускоряете поиск и модификацию. Важно понимать, что расширение этого магического числа означает патч на базу и приложение.
...
Рейтинг: 0 / 0
11.07.2010, 08:08
    #36734474
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
SERG1257,

Авторы могут принадлежать нулю, только одной , большому числу групп
У каждого автора может быть ноль, один или несколько документов
У каждого документа может быть ноль, только одно , конечное число (максимум два, три, n) или бесконечно много описаний, ключевых слов, заголовков (нужное подчеркнуть)
Документы могут быть показаны в виде иерархии (документы в иерархии должны принадлежать одному автору или могут разным?)

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

Также:
- поиск автора по логину
- список документов одного автора
- список документов по ключевым словам

какие запросы нужны для поддержания иерархии? Типа дай мне все документы подчиненные этому с уровнем вложения не более двух
Типа дай мне все документы по имени

ну и более понятная схема
...
Рейтинг: 0 / 0
11.07.2010, 08:53
    #36734482
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
Тогда имеем
Код: plaintext
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.
create table groups
(
id_group int primary key,
desc_group varchar
)

create table status
(
id_status int primary key,
descr_status varchar
)

create table authors
(
id_author int primary key,
id_group references groups not null,
login varchar not null,
password varchar
id_status int references status
)

create index id_author_by_login (login)

create table templates 
(
id_template int primary key,
desc_templ varchare,
.....
)

create table documents
(
id_doc int primary key,
id_author int references authors not null
d_creaded date,
d_changed date,
title varchar,
description varchar,
body clob,
id_created int references authors not null,
id_changed int references authors null,
id_status int references status
id_template int references templates -- документ может быть только из одного шаблона
....
)

create table keywords 
(
id_keyword int primary key,
keyword varchar,
)

create index ix_keyword (keyword)

create table doc_keywords_xref 
(
id_keyword int,
id_doc int
primary key (id_keyword,id_doc)
)



Внешние ключи надо проиндексировать

Иерархия реализуется более чем одним способом
http://www.sql.ru/articles/mssql/2005/061904TreesInSQLdatabases.shtml
выбирайте какой вам понравится. У вашего способа есть свои недостатки.

По поводу дат. Я не понял почему вы не пользуетесь стандартным типом Дата.
...
Рейтинг: 0 / 0
11.07.2010, 08:59
    #36734486
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
Вот ссылка на Целко
http://www.sql.ru/articles/mssql/01091502TreesInSQL.shtml
ссылка старовата, но общая идея должна быть понятна.
...
Рейтинг: 0 / 0
11.07.2010, 11:08
    #36734521
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
SERG1257,

в итоге мы пришли к тому с чего начали, вы вообще на диаграму смотрели?
спасибо конечно, но ничего нового я не услышал..

INNODB
Код: plaintext
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.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
USE BASE;

CREATE TABLE Attributes(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value ENUM('visible', 'hidden') NOT NULL,
	PRIMARY KEY (ID),
	INDEX value (Value)
)
ENGINE = INNODB
AUTO_INCREMENT =  3 
AVG_ROW_LENGTH =  8192 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;
CREATE TABLE Groups(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value ENUM('guest', 'manager', 'user') NOT NULL,
	PRIMARY KEY (ID),
	INDEX value (Value)
)
ENGINE = INNODB
AUTO_INCREMENT =  4 
AVG_ROW_LENGTH =  5461 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

CREATE TABLE Keywords(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value VARCHAR( 128 ) NOT NULL,
	PRIMARY KEY (ID),
	INDEX value (Value)
)
ENGINE = INNODB
AUTO_INCREMENT =  13 
AVG_ROW_LENGTH =  1365 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

CREATE TABLE Status(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value ENUM('on', 'off') NOT NULL,
	PRIMARY KEY (ID),
	INDEX value (Value)
)
ENGINE = INNODB
AUTO_INCREMENT =  3 
AVG_ROW_LENGTH =  8192 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

CREATE TABLE Titles(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value VARCHAR( 64 ) NOT NULL,
	PRIMARY KEY (ID),
	INDEX value (Value)
)
ENGINE = INNODB
AUTO_INCREMENT =  8 
AVG_ROW_LENGTH =  2340 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;


CREATE TABLE Bodys(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value MEDIUMTEXT NOT NULL,
	PRIMARY KEY (ID),
	INDEX Value (Value ( 1 ))
)
ENGINE = INNODB
AUTO_INCREMENT =  6 
AVG_ROW_LENGTH =  3276 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

CREATE TABLE Dates(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (ID),
	INDEX value (Value),
	UNIQUE INDEX Value_2 (Value)
)
ENGINE = INNODB
AUTO_INCREMENT =  6 
AVG_ROW_LENGTH =  4096 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

CREATE TABLE Descriptions(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Value VARCHAR( 128 ) NOT NULL,
	PRIMARY KEY (ID),
	INDEX value (Value)
)
ENGINE = INNODB
AUTO_INCREMENT =  15 
AVG_ROW_LENGTH =  1170 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

CREATE TABLE Authors(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	Name VARCHAR( 64 ) NOT NULL,
	`Password` VARCHAR( 64 ) NOT NULL,
	ID_Authorized INT( 16 ) UNSIGNED NOT NULL,
	ID_Blocked INT( 16 ) UNSIGNED NOT NULL,
	ID_Groups INT( 16 ) UNSIGNED NOT NULL,
	ID_Status INT( 16 ) UNSIGNED NOT NULL,
	PRIMARY KEY (ID),
	INDEX FK_Authors_Dates_ID1 (ID_Authorized),
	INDEX FK_Authors_Dates_ID2 (ID_Blocked),
	INDEX FK_Authors_Groups_ID (ID_Groups),
	INDEX FK_Authors_Status_ID (ID_Status),
	CONSTRAINT FK_Authors_Dates_ID1 FOREIGN KEY (ID_Authorized)
	REFERENCES dates (ID),
	CONSTRAINT FK_Authors_Dates_ID2 FOREIGN KEY (ID_Blocked)
	REFERENCES dates (ID),
	CONSTRAINT FK_Authors_Groups_ID FOREIGN KEY (ID_Groups)
	REFERENCES groups (ID),
	CONSTRAINT FK_Authors_Status_ID FOREIGN KEY (ID_Status)
	REFERENCES status (ID)
)
ENGINE = INNODB
AUTO_INCREMENT =  2 
AVG_ROW_LENGTH =  16384 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

CREATE TABLE Documents(
	ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	PID INT( 16 ) UNSIGNED NOT NULL,
	Name VARCHAR( 32 ) NOT NULL,
	ID_Author INT( 16 ) UNSIGNED NOT NULL,
	ID_Description INT( 16 ) UNSIGNED NOT NULL,
	ID_Keyword INT( 16 ) UNSIGNED NOT NULL,
	ID_Title INT( 16 ) UNSIGNED NOT NULL,
	ID_Body INT( 16 ) UNSIGNED NOT NULL,
	ID_Created INT( 16 ) UNSIGNED NOT NULL,
	ID_Changed INT( 16 ) UNSIGNED NOT NULL,
	ID_Attribute INT( 16 ) UNSIGNED NOT NULL,
	PRIMARY KEY (ID),
	INDEX FK_Documents_Bodys_ID (ID_Body),
	INDEX FK_Documents_Dates_ID (ID_Created),
	INDEX FK_Documents_Dates_ID2 (ID_Changed),
	INDEX FK_Documents_Descriptions_ID (ID_Description),
	INDEX FK_Documents_Keywords_ID (ID_Keyword),
	INDEX FK_Documents_Titles_ID (ID_Title),
	UNIQUE INDEX ID_Author (ID_Author),
	INDEX value (ID_Attribute, ID_Author, ID_Body, ID_Changed, ID_Created, ID_Description, ID_Keyword, ID_Title),
	CONSTRAINT FK_Documents_Attributes_ID FOREIGN KEY (ID_Attribute)
	REFERENCES attributes (ID),
	CONSTRAINT FK_Documents_Authors_ID FOREIGN KEY (ID_Author)
	REFERENCES authors (ID),
	CONSTRAINT FK_Documents_Bodys_ID FOREIGN KEY (ID_Body)
	REFERENCES bodys (ID),
	CONSTRAINT FK_Documents_Dates_ID FOREIGN KEY (ID_Created)
	REFERENCES dates (ID),
	CONSTRAINT FK_Documents_Dates_ID2 FOREIGN KEY (ID_Changed)
	REFERENCES dates (ID),
	CONSTRAINT FK_Documents_Descriptions_ID FOREIGN KEY (ID_Description)
	REFERENCES descriptions (ID),
	CONSTRAINT FK_Documents_Keywords_ID FOREIGN KEY (ID_Keyword)
	REFERENCES keywords (ID),
	CONSTRAINT FK_Documents_Titles_ID FOREIGN KEY (ID_Title)
	REFERENCES titles (ID)
)
ENGINE = INNODB
AUTO_INCREMENT =  2 
AVG_ROW_LENGTH =  16384 
CHARACTER SET cp1251
COLLATE cp1251_general_ci;
ну или

MYISAM
Код: plaintext
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.
CREATE DATABASE IF NOT EXISTS BASE;

USE BASE;

DROP TABLE IF EXISTS Documents;
CREATE TABLE IF NOT EXISTS Documents(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  PID INT( 16 ) UNSIGNED NOT NULL,
  Name VARCHAR( 32 ) NOT NULL,
  ID_Author INT( 16 ) UNSIGNED NOT NULL,
  ID_Description INT( 16 ) UNSIGNED NOT NULL,
  ID_Keyword INT( 16 ) UNSIGNED NOT NULL,
  ID_Title INT( 16 ) UNSIGNED NOT NULL,
  ID_Body INT( 16 ) UNSIGNED NOT NULL,
  ID_Created INT( 16 ) UNSIGNED NOT NULL,
  ID_Changed INT( 16 ) UNSIGNED NOT NULL,
  ID_Attribute INT( 16 ) UNSIGNED NOT NULL,
  PRIMARY KEY (ID),
  INDEX value (ID_Attribute, ID_Author,
  ID_Body, ID_Changed, ID_Created,
  ID_Description, ID_Keyword, ID_Title)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Authors;
CREATE TABLE IF NOT EXISTS Authors(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Name VARCHAR( 64 ) NOT NULL,
  Password VARCHAR( 64 ) NOT NULL,
  ID_Authorized INT( 16 ) UNSIGNED NOT NULL,
  ID_Blocked INT( 16 ) UNSIGNED NOT NULL,
  ID_Groups INT( 16 ) UNSIGNED NOT NULL,
  ID_Status INT( 16 ) UNSIGNED NOT NULL,
  PRIMARY KEY (ID)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Descriptions;
CREATE TABLE IF NOT EXISTS Descriptions(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value VARCHAR( 128 ) NOT NULL,
  PRIMARY KEY (ID),
  INDEX value (value)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Keywords;
CREATE TABLE IF NOT EXISTS Keywords(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value VARCHAR( 128 ) NOT NULL,
  PRIMARY KEY (ID),
  INDEX value (value)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Titles;
CREATE TABLE IF NOT EXISTS Titles(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value VARCHAR( 64 ) NOT NULL,
  PRIMARY KEY (ID),
  INDEX value (value)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Bodys;
CREATE TABLE IF NOT EXISTS Bodys(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value MEDIUMTEXT NOT NULL,
  PRIMARY KEY (ID),
  INDEX Value (Value ( 1 ))
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Status;
CREATE TABLE IF NOT EXISTS Status(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value ENUM('on', 'off') NOT NULL,
  PRIMARY KEY (ID),
  INDEX value (value)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Groups;
CREATE TABLE IF NOT EXISTS Groups(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value ENUM('guest', 'manager', 'user') NOT NULL,
  PRIMARY KEY (ID),
  INDEX value (value)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Dates;
CREATE TABLE IF NOT EXISTS Dates(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (ID),
  INDEX value (value)
) ENGINE = MYISAM;

DROP TABLE IF EXISTS Attributes;
CREATE TABLE IF NOT EXISTS Attributes(
  ID INT( 16 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  Value ENUM('visible', 'hidden') NOT NULL,
  PRIMARY KEY (ID),
  INDEX value (Value)
) ENGINE = MYISAM;
...
Рейтинг: 0 / 0
11.07.2010, 18:05
    #36734811
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
А зачем вы вынесли заголовок, описание и тело документа по отдельным таблицам?
Я не видел в условиях задачи необходимость вертикального секционирования, или это особенность MySQL
KISS
schizophrenic
в итоге мы пришли к тому с чего начали, вы вообще на диаграму смотрели?
спасибо конечно, но ничего нового я не услышал.Зато вы получили ответ на первый пост, плюс огласили условие задачи
...
Рейтинг: 0 / 0
12.07.2010, 08:19
    #36735139
Lemegeton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
Вот мне тоже не кажется логичной подобная декомпозиция.
schizophrenicСкажите пожалуйста я правильно спроектировал базу данных для сайта.
Если нет то прошу указать мне на мои ошибки и привести (по возможности) правильный пример
Нет, не правильно.
Ошибка в излишней декомпозиции.
Схема избыточна - увеличивается объем хранимой информации, сложность и, как следствие, время выполнения запросов.

Правильные примеров в ответах на ваши посты уже как минимум два.
schizophrenicв итоге мы пришли к тому с чего начали, вы вообще на диаграму смотрели?
спасибо конечно, но ничего нового я не услышал..
Совершенно не к тому же. Даже не близко. Serg1257 привел свою схему данных по поставленной задаче. Она несколько расширяет функционал поставленной задачи, но так же и очень сильно отличается от того, что привели вы.

SERG1257Я не видел в условиях задачи необходимость вертикального секционирования, или это особенность MySQL Нет такой особенности MySQL.
Шиз, видимо, неправильно понял третью нормированную форму. В частности, выражение " Ничего, кроме ключа ".
...
Рейтинг: 0 / 0
12.07.2010, 10:53
    #36735301
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
Вот как таз под 3НФ я и переработал структуру!

Lemegeton..Схема избыточна - увеличивается объем хранимой информации, сложность и, как следствие, время выполнения запросов..Особое внимание обратите на таблицу Dates,
она спроектированы таким образом что таблицу используют как таблицы Documents так и Authors
в следствии чего мы получаем единую гриппу дат для четырех внешних индексов.

А также к таблице Names идет обращение по четырем внешних индексам из таблицы Documents...

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

Делайте выводы!
...
Рейтинг: 0 / 0
12.07.2010, 10:57
    #36735312
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
вот пример выборки:
Код: plaintext
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.
SELECT
	Page.Value AS Page,
	Descriptions.Value AS Description,
	Keywords.Value AS Keyword,
	Titles.Value AS Title,
	Bodys.Value AS Body,
	Temlates.Value AS Temlate,
	Created.Value AS Created,
	Changed.Value AS Changed,
	Nickname.ID_Authorized
FROM
	BASE.Documents
	LEFT OUTER JOIN BASE.Names Page
		ON Documents.ID_Name = Page.ID
	LEFT OUTER JOIN BASE.Descriptions
		ON Documents.ID_Description = Descriptions.ID
	LEFT OUTER JOIN BASE.Keywords
		ON Documents.ID_Keyword = Keywords.ID
	LEFT OUTER JOIN BASE.Titles
		ON Documents.ID_Title = Titles.ID
	LEFT OUTER JOIN BASE.Bodys
		ON Documents.ID_Body = Bodys.ID
	LEFT OUTER JOIN BASE.Attributes
		ON Documents.ID_Attribute = Attributes.ID
	LEFT OUTER JOIN BASE.Temlates
		ON Documents.ID_Template = Temlates.ID
	LEFT OUTER JOIN BASE.Dates Created
		ON Documents.ID_Created = Created.ID
	LEFT OUTER JOIN BASE.Dates Changed
		ON Documents.ID_Changed = Changed.ID
	LEFT OUTER JOIN BASE.Names Author
		ON Documents.ID_Author = Author.ID
	LEFT OUTER JOIN BASE.Authors Nickname
		ON Author.ID = Nickname.ID_Nickname
WHERE
	Page.Value = 'help' AND
	Attributes.Value = 'visible'
кто скажет что это долгая пробежка по таблицам?
...
Рейтинг: 0 / 0
12.07.2010, 11:00
    #36735315
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
...
Рейтинг: 0 / 0
12.07.2010, 11:34
    #36735392
Senja
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
schizophrenic и хоронят в себе различные данные
Очень правильное определение. Именно хоронят .

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

Не надо создавать таблицы-справочники на каждое поле. Да, возможно таким образом вы сократите размер базы (хотя не факт, ключи тоже надо хранить). Но сейчас диски дешевы, и нет ничего страшного в том, что база будет занимать в 100 Мб вместо 50. А вот проблем с производительностью запросов вы получите кучу. Ведь каждый раз, когда вы джойните таблицы в запросе, серверу приходится лезть в одну таблицу, лезть в другую, и тем или иным алгоритмом соединять их. Это медленне чем просто прочитать одну таблицу. Я уже и не говорю о ситуации когда вам надо будет делать выборку с условием по двум полям.
...
Рейтинг: 0 / 0
12.07.2010, 11:46
    #36735429
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
Senjaхотя не факт, ключи тоже надо хранитьа что по вашему делают таблицы Documents и Authors- хранят ключи!
...
Рейтинг: 0 / 0
12.07.2010, 13:07
    #36735637
Lemegeton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
schizophrenicВот как таз под 3НФ я и переработал структуру!
К нормализации можно привести несколькими способами. Ваш далеко не лучший с точки зрения реализации.

schizophrenicОсобое внимание обратите на таблицу Dates,
она спроектированы таким образом что таблицу используют как таблицы Documents так и Authors
в следствии чего мы получаем единую гриппу дат для четырех внешних индексов.

Вы забыли, что поля, хранящие ключ даты в других таблицах (Id_Created, Id_Changed и им подобные) имеют размерность INT, которая РАВНА размеру в байтах типа TIMESTAMP. То есть, что хранить ключ, что хранить собственно дату -- разницы в байтах никакой. Вы ничегошеньки не выиграли, а только проиграли целую излишнюю таблицу, индексы в ней и работу с ней.

Но давайте обратим особое внимание на таблицу Dates.
Допустим, есть два документа:

Документы
Текст Id_ChangedПервый пост 1Второй пост 1

Авторы Id_authorizedВася 1Петя 1

Даты
Id date1 2010-01-01 12:00:00

Вопрос. Что, в рамках вашей базы, надо сделать, чтобы у первого документа и только у первого и только документа изменилась дата обновления?

schizophrenicкто скажет что это долгая пробежка по таблицам?
EXPLAIN и PROFILING, когда у вас будет миллион записей в таблице документов и три миллиона записей в таблице дат. На не хай-эндовом железе тормоза начнутся при объеме на несколько порядков меньше. Ну, может еще все те, кто фалломорфировал или фалломорфируют в будущем от подобного подхода.

Сделайте "рыбу" и убедитесь сами, если не верите никому на слово.

schizophrenicа самое главное то что данная структура шикарно оптимизирована по кеширование запросов и таблиц (MySQL)
В силу особенностей мозгов разработчиков кеширования MySQL, к кешированию имеют отношения только запросы и их значения. От структуры это не зависит.


schizophrenicДелайте выводы!
Делаем выводы.
1. База избыточна. Причем сильно избыточна.
2. Работа с такой структурой -- каторжный труд. Особенно изменение и удаление аттрибутов записей документов.
3. Аналогичные предоставленные решения более простые, быстрые и меньшие по объему.

В качестве отступления.
schizophrenic , а зачем ви спрашиваете, если считаете свое решение единственно верным?
...
Рейтинг: 0 / 0
12.07.2010, 13:39
    #36735704
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
LemegetonВопрос. Что, в рамках вашей базы, надо сделать,
чтобы у первого документа и только у первого и только документа изменилась дата обновления?Ответ. Поменять ID на другую дату если она есть, или создать новую в обратном случае.
Таким образом сотни документов созданных в определенный день или модифицированных,
будут иметь один ID где в таблице с датами будет всего одно значение..


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


LemegetonВ силу особенностей мозгов разработчиков кеширования MySQL,
к кешированию имеют отношения только запросы и их значения. От структуры это не зависит .это надо запомнить ))

LemegetonВ качестве отступления.
schizophrenic, а зачем ви спрашиваете, если считаете свое решение единственно верным?Я до последнего спорю всегда, потом собираю все за и против и делаю выводы, на счет рыбы,
сейчас займусь этим вопросом и обязательно отпишусь

Спасибо!

да кстати без рыбы такой запрос
Код: plaintext
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.
SET profiling =  1 ;

SELECT
	Page.Value AS Page,
	Descriptions.Value AS Description,
	Keywords.Value AS Keyword,
	Titles.Value AS Title,
	Bodys.Value AS Body,
	Temlates.Value AS Temlate,
	Created.Value AS Created,
	Changed.Value AS Changed,
	Name.Value AS Name,
	Surname.Value AS Surname,
	Nickname.Value AS Nickname
FROM
	BASE.Documents
	LEFT OUTER JOIN BASE.Names Page
		ON Documents.ID_Name = Page.ID
	LEFT OUTER JOIN BASE.Descriptions
		ON Documents.ID_Description = Descriptions.ID
	LEFT OUTER JOIN BASE.Keywords
		ON Documents.ID_Keyword = Keywords.ID
	LEFT OUTER JOIN BASE.Titles
		ON Documents.ID_Title = Titles.ID
	LEFT OUTER JOIN BASE.Bodys
		ON Documents.ID_Body = Bodys.ID
	LEFT OUTER JOIN BASE.Attributes
		ON Documents.ID_Attribute = Attributes.ID
	LEFT OUTER JOIN BASE.Temlates
		ON Documents.ID_Template = Temlates.ID
	LEFT OUTER JOIN BASE.Dates Created
		ON Documents.ID_Created = Created.ID
	LEFT OUTER JOIN BASE.Dates Changed
		ON Documents.ID_Changed = Changed.ID
	LEFT OUTER JOIN BASE.Authors Author
		ON Documents.ID_Author = Author.ID
	LEFT OUTER JOIN BASE.Names Name
		ON Author.ID_Name = Name.ID
	LEFT OUTER JOIN BASE.Names Surname
		ON Author.ID_Surname = Surname.ID
	LEFT OUTER JOIN BASE.Names Nickname
		ON Author.ID_Nickname = Nickname.ID
WHERE
	Page.Value = 'help' AND
	Attributes.Value = 'visible';

SHOW PROFILE FOR QUERY  1 ;
дает:
Status Durationstarting 0.000281Opening tables 0.000870System lock 0.000009Table lock 0.000015init 0.000100optimizing 0.000040statistics 0.000325preparing 0.000033executing 0.000005Sending data 0.000038end 0.000006query end 0.000005freeing items 0.003784logging slow query 0.000006cleaning up 0.000018
обратите внимание на Opening tables и freeing items
так что на счет количества таблиц я бы поспорил!

это сам запрос!
...
Рейтинг: 0 / 0
12.07.2010, 14:08
    #36735782
schizophrenic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
EXPLAIN запроса

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra 1.0SIMPLEPageconstPRIMARY.ValueValue34const 1.0Using index 1.0SIMPLEAttributesconstPRIMARY.ValueValue1const 1.0Using index 1.0SIMPLEDocumentsconstFK_Documents_Name_ID.FK_Documents_Attributes_IDFK_Documents_Name_ID4const 1.0 1.0SIMPLEDescriptionsconstPRIMARYPRIMARY4const 1.0 1.0SIMPLEKeywordsconstPRIMARYPRIMARY4const 1.0 1.0SIMPLETitlesconstPRIMARYPRIMARY4const 1.0 1.0SIMPLEBodysconstPRIMARYPRIMARY4const 1.0 1.0SIMPLETemlatesconstPRIMARYPRIMARY4const 1.0 1.0SIMPLECreatedconstPRIMARYPRIMARY4const 1.0 1.0SIMPLEChangedconstPRIMARYPRIMARY4const 1.0 1.0SIMPLEAuthorconstPRIMARYPRIMARY4const 1.0 1.0SIMPLENameconstPRIMARYPRIMARY4const 1.0 1.0SIMPLESurnameconstPRIMARYPRIMARY4const 1.0 1.0SIMPLENicknameconstPRIMARYPRIMARY4const 1.0
...
Рейтинг: 0 / 0
12.07.2010, 16:58
    #36736393
Кифирчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
таблицу c датами вынести - это что-то новенькое
ИМХО, вы слишком декомпозировали (как вам уже говорили выше)
заголовок, дату и описание - можно оставить в основной таблице
обьем данных не уменьшится, так как для каждой статьи будет уникальный заголовок, и описание, просто вы по разным таблица разносите, и заставите потом процессор, прыгать по индексам и джойнить
чем меньше join в запросах - тем быстрее он будет выполняться,
даже если таблица будет больше в размерах

вот интересно, запрос
select...
...
join titles as tit...
join dates as dt...
...
where year(dt.value) = 2010
and month(dt.value) = 7
and tit.value like '%audi%'

как думаете? оптимизатор, бережливо сперва в таблице с датами пороется, выберет какие id будут в нужном диапазоне, потом по таблице titles, там нужный диапазон id выберет
и красиво выберет нужное из таблицы documents, и только потом приджойнит все внешние таблицы?
мне почему-то кажется, что он сперва в памяти выстроит общую таблицу, то есть всей таблице documents сделает join внешних таблиц, а потом по ней пробежится с LIKE и просчитает month & year для даты. конечно могу ошибаться, но результат явно не айс будет

чтобы проверить на сколько ваш вариант оптималный - сгенерируйте тестовых данных, так чтоб там тыс 5..10 статей было, и погоняйте запросы, желательно в 2..3 потока
...
Рейтинг: 0 / 0
12.07.2010, 17:05
    #36736424
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
schizophrenicLemegetonВопрос. Что, в рамках вашей базы, надо сделать,
чтобы у первого документа и только у первого и только документа изменилась дата обновления?Ответ. Поменять ID на другую дату если она есть, или создать новую в обратном случае.
Таким образом сотни документов созданных в определенный день или модифицированных,
будут иметь один ID где в таблице с датами будет всего одно значение..то есть вместо простого апдейта по ид документа надо будет искать нужную дату, если не нашли, то создавать её, потом апдейтить ссылку на неё, а в это время кто-то ещё мог такую же дату ввести... вы серьёзно полагаете, что это проще и удобнее?
ЗЫ. в качестве доведённого до абсурда примера предлагаю вам такую структуру:
Код: plaintext
1.
2.
3.
4.
5.
documents(id,id_name,....);
name1 (id);
name2 (id);
name3 (id);
...
nameN (id,value)
, где для всех N>1 tableN(id) является рефом на table[N-1](id)
...
Рейтинг: 0 / 0
12.07.2010, 17:57
    #36736619
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
База для сайта #2
tanglirто есть вместо простого апдейта по ид документа надо будет искать нужную дату, если не нашли, то создавать её, потом апдейтить ссылку на неё, а в это время кто-то ещё мог такую же дату ввести... вы серьёзно полагаете, что это проще и удобнее?+1. А как удобно будет искать данные по диапазону дат... закачаешься! ))
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / База для сайта #2 / 25 сообщений из 57, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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