Для составных типов можно рекурсивно преобразовать каждого, что Вы сталкиваетесь в собственную таблицу и затем пытаетесь управлять отношениями внешнего ключа.
можно также хотеть предварительно определить , который классы будут или не преобразовываться в таблицы. Что касается сложных данных, которые Вы хотите отраженный в базе данных, не чрезмерно увеличивая размер схемы, у Вас может быть одна или несколько таблиц для разных типов. Этот пример использует целых 4:
CREATE TABLE MiscTypes /* may have to include standard types as well */
( TypeID INT,
TypeName VARCHAR(...)
)
CREATE TABLE MiscProperties
( PropertyID INT,
DeclaringTypeID INT, /* FK to MiscTypes */
PropertyName VARCHAR(...),
ValueTypeID INT /* FK to MiscTypes */
)
CREATE TABLE MiscData
( ObjectID INT,
TypeID INT
)
CREATE TABLE MiscValues
( ObjectID INT, /* FK to MiscData*/
PropertyID INT,
Value VARCHAR(...)
)
Он использует регулярное выражение для извлечения идентификатора видео из полного URL. Это конкретное регулярное выражение разбивается следующим образом:
[\\? &]
- это класс символов. Он соответствует одному символу и
или ?
. (Знак вопроса является специальным символом в регулярных выражениях JavaScript, поэтому его необходимо экранировать, поставив перед ним обратную косую черту. Обратная косая черта - это специальный символ в строках JavaScript, поэтому он также должен экранироваться, следовательно, двойной обратная косая черта. Это довольно часто встречается в регулярных выражениях.) v =
соответствует литеральной строке v =
. (
начинает группу захвата, поэтому все до следующего ])
будет помещен в отдельную запись в возвращаемом массиве. [^ & #] *
любое количество символов (включая ни одного) до тех пор, пока не будет найден &
или #
. Скобки указывают класс символов, как указано выше, а ^
инвертирует класс так, чтобы он включал все символы , кроме тех, которые перечислены перед конечной скобкой. *
указывает, что предыдущий класс символов должен быть сопоставлен ноль или более раз. )
завершает группу захвата. Предполагая, что сопоставление прошло успешно, ] results [0]
содержит полный URL, а results [1]
содержит содержимое первой группы захвата, то есть идентификатор видео.
Соответствует идентификатору видео в URL-адресе YouTube.
[\\? &] V =
// находит первое? V = или & v = в строке запроса
([^ & #] *)
// соответствует всему иначе до следующего & или #
Идентификатор видео сохраняется в результатах [1]
(при условии совпадения)