CCK и БД - конспективный перевод (часть третья)

Главные вкладки

Аватар пользователя karasiov@drupal.org karasiov@drupal.org 16 ноября 2008 в 19:08

окончание. начало тут и тут

Создание контента

1. Данные общие для всех узлов (автор, дата публикации, версии и т.д.) Друпал хранит в таблицах node и node_revisions.
2. Данные расширяющие ТД Друпал хранит в таблицах создаваемых ССК. В нашем случае это таблица content_type_test.

mysql> select * from content_type_test;
Column name Value
vid 1
nid 1
field_example_text_value Here is some example text! Forbidden HTML will be stripped.
field_example_text_format 1

Добавление второго поля.

1. Добавление числового поля осуществляется включением модуля number.module, который входит в состав ССК.
2. Числовые поля для ввода данных используют те же текстовые поля, что говорит нам еще раз о независимости типа вводимых данных от способа ввода данных.


Примечание: Текст на выноске гласит о том, что несмотря на разницу типов данных (целое, дробь, текст) спосов ввода(виджет) одинаков для всех.

3. Способы конфигурации для полей целого типа и текстового типа различны.
4. Объясняется это разными способами валидации при вводе. Количество возможных вариантов для чисел меньше чем для текста, поэтому надо проводить дополнительную проверку перед помещением данных в БД. В свою очередь, ограничения для чисел вида "максимум" и "минимум" не имеют смысла применительно к текстовым полям.

Примечание: далее следует врезка цитаты из обсуждения о том, как ССК проверяет вводимые данные и почему все устроено именно так.

5. Нетрудно догадаться, что все созданные поля отображаются в БД.
6. Следует отметить, что различные типы данных хранятся в БД различными способами.

mysql> describe content_type_test;
+-------------------------------------+------------------+------+-----+
| Field                               | Type             | Null | Key |
+-------------------------------------+------------------+------+-----+
| vid                                 | int(10) unsigned | NO   | PRI |
| nid                                 | int(10) unsigned | NO   |     |
| field_example_text_value            | longtext         | YES  |     |
| field_example_text_format           | int(10) unsigned | NO   |     |
| field_number_of_toes_you_have_value | int(11)          | YES  |     |
+-------------------------------------+-------------------------------+
Поле числового типа хранит только данные. Поле текстового типа хранит и данные и
способ форматирования.

Множественные значения

1. Если поменять настройку поля с еденичное на "множественное" -- способ хранения даннх в БД изменится.

2. При включенной опции "multiple values" вы можете заполнять бесконечное количество полей указанного типа. Дополнительные свободные поля будут появляться всякий раз при новом редактировании материала.

Примечание: Выноски на картинке говорят о том, что
а) Каждый экземпляр поля модет иметь свой формат ввода
б) Коль скоро включена опция "multiple values" -- количество полей "Example text" теперь ничем не огранничено.

3. Как уже было сказанно, при включении опции "multiple values" - способ хранения данных меняется.

mysql> describe content_type_test;
+-------------------------------------+------------------+------+-----+
| Field                               | Type             | Null | Key |
+-------------------------------------+------------------+------+-----+
| vid                                 | int(10) unsigned | NO   | PRI |
| nid                                 | int(10) unsigned | NO   |     |
| field_number_of_toes_you_have_value | int(11)          | YES  |     |
+-------------------------------------+------------------+------+-----+
текстовые поля удалены из базы

4. Для полей помеченных как множественные ССК создает отдельные таблицы.

mysql> describe content_field_example_text;
+---------------------------+------------------+------+-----+---------+-------+
| Field                     | Type             | Null | Key | Default | Extra |
+---------------------------+------------------+------+-----+---------+-------+
| vid                       | int(10) unsigned | NO   | PRI | 0       |       | 
| delta                     | int(10) unsigned | NO   | PRI | 0       |       | 
| nid                       | int(10) unsigned | NO   |     | 0       |       | 
| field_example_text_value  | longtext         | YES  |     | NULL    |       | 
| field_example_text_format | int(10) unsigned | NO   |     | 0       |       | 
+---------------------------+------------------+------+-----+---------+-------+

5. А вот так данные хранятся в базе.

mysql> select * from content_field_example_text;
vid delta nid field_example_text_value field_example_text_format
1 0 1 Here is some example text! <div>Forbidden HTML will be stripped.div> 1
1 1 1 I can use a different input format for each text field! 3
1 2 1 Even more example text. 1

Семантическое значение и совместное использование полей

1. Одна из основных задач ССК состоит в том, что бы придать полям семантическое значение. Что это значит?

2. Это значит, что поле под названием "Возраст" имеет ту же природу (целое число) что и поле "Количество". Но значение они имеют разное.

3. Оба поля хранят числа. Оба сконфигурированы для ввода положительных чисел. Но возраст тем не менее должен пониматься как количество прожитых лет, а Количество должно пониматься как другое отличное значение (число ног, допустим).

4. Более того зачастую некое поле с неким семантическим значением должно использоваться более чем в одном типе данных.

5. Например тип данных Персона пожет иметь поле "Возраст" И тип данных "Животное" тоже может иметь поле "Возраст". семантически оба полля должны иметь одиаковое значение. ССК решает эту проблему позволяя вам использовать уже существующие поля в любом количестве типов данных.
Примечание: идея-то простая -- но поди изложи её внятно.

6. После того как поле использоваано более чем в одном типе денных его значения более не хранятся в таблицах имеющих отношение к типу данных. Создается новая таблица для хранения значений поля совместно используемого несколькими типами данных.

mysql> describe content_field_number_of_toes_you_have;
+-------------------------------------+------------------+------+-----+
| Field                               | Type             | Null | Key |
+-------------------------------------+------------------+------+-----+
| vid                                 | int(10) unsigned | NO   | PRI |
| nid                                 | int(10) unsigned | NO   |     |
| field_number_of_toes_you_have_value | int(11)          | YES  |     |
+-------------------------------------+------------------+------+-----+

7. После всех манипуляций изначальная таблица пришла к такому вот виду:

mysql> describe content_type_test;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| vid   | int(10) unsigned | NO   | PRI | 0       |       | 
| nid   | int(10) unsigned | NO   |     | 0       |       | 
+-------+------------------+------+-----+---------+-------+

комментарии, как всегда, в комментарии