Что не так с текстологией и как исправить ситуацию? Часть II. Практикум
Той программой, которая должна облегчить текстологическую работу является управляющая программа базы данных, выступающая как своеобразный секретарь по хранению перечней, называемых таблицами. Общественной функцией управляющей программы баз данных является обобществление сведений и поддержание информационной централизации. Принцип информационной централизации в работах того же Китова расшифровывается как единственный способ обращения к некоторым сведениям, притом такой, что в результате обязательно оказывается нечто актуальное и достоверное.
От наивной реализации принципа работы с безбумажными сведениями до современных программ управления реляционными базами данных человечество прошло длинный путь. Важнейшие технические факторы преодоления частной собственности были раскрыты в работах Виктора Глушкова по хозяйственной регуляции и в математических трактатах Эдгара Кодда, которые открывают совершенно новые технические возможности при соединении с принципами Глушкова. Для российских текстологов эта специальная литература, имеющаяся в варшавских библиотеках пожалуй будет излишней. Популярная литература по реляционным базам данных тоже. Вообще бытовое сознание по поводу баз данных обладает уровнем профессионального понимания берутовской Польши. То есть сознание польских учёных, занимавшихся массивами данных и картотеками в середине 1950-х годов сейчас с некоторыми упрощениями воспроизводится каждым городским жителем любой из европейских стран, где существовали режимы народной демократии. Разумеется, ключом к этому стихийному умозрительному схватыванию является более развитая сознательная форма - понимание количественно господствующих уже как несколько десятилетий реляционных баз данных. Поэтому интереснейшую историю становления принципов обобществления сведений придётся в данном случае проигнорировать.
Подготовка к практикуму.
В настоящий момент любому желающему доступные бесплатные, хорошо проверенные и выносливые программы управления реляционными базами данных. Среди них выделяются SQLite (польск. [скули́тэ]) и PostgreSQL (польск. [постгрэ́скуль], чаще просто [по́стгрэс], тогда произношение совпадает с немецким, фламандским и чешским).
Установка этих программ довольно проста. В Ubuntu и других популярных операционных системах на основе Debian нужно набрать в поиске приложений для установки «sqlite3» или «postgresql» либо от имени администратора набрать apt-get install sqlite3 или apt-get install postgresql. В менее популярных операционных системах на основе Fedora или RedHat пакеты с близкими названиями нужно устанавливать от имени администратора через команду yum. Про установку на MacOS сообщить что либо затруднительно, ибо квалифицированных пользователей этой операционной системы рядом не нашлось.
Диалог с программами управления реляционными базами данными ведётся в текстовом виде. Текстовый диалог является универсальным и к нему сводится почти всё обычное взаимодействие с программой, управляющей базой данных1. Текст диалога составляется по особым формальным правилам, близким к одному из стандартов языка SQL. Существуют программы, которые позволяют вести диалог с базой данных не набирая текст, однако в конечном счёте они тоже формируют и посылают текст, хотя и не демонстрируют его. Умение обращения с базой данных сводится к пониманию того, что она содержит и как выразить свои потребности в виде текста SQL. Программа управления базой данных при своей работе выполняет функции секретаря и канцеляриста, откликаясь на специально составленные SQL-фразы.
Практикум с базами данными необходимо начать с подготовки программы, которая будет отвечать. Работу с SQLite можно начать после введения в терминале операционной системы
sqkite3 nazwa.sqlite;
В этом случае база данных будет размещена в единственном файле «nazwa.sqlite», который будет размещён в текущем каталоге (обычно это каталог пользователя). Упоминая каждый раз этот файл, можно сохранять преемственность (накопительность) обращений к базе данных. Первой командой для SQLite должна быть
PRAGMA foreign_keys = ON;
Эта команда позднее позволит использовать ссылки между таблицами.
Аналогичную работу можно проводить на сайте https://kripken.github.io/sql.js/GUI/ , где все команды можно указывать одну за одной вместо написанных там в центре.
Для подготовки к работе программы PostgreSQL нужно выполнить несколько шагов. Первым шагом нужно создать пользователя, который будет работать с базами данных, а вторым шагом нужно создать базу данных, где этот пользователь будет полновластным хозяином. Имя пользователя для простоты работы должно совпадать и именем пользователя в операционной системе. Так, если в системе работает пользователь wojcech, то обычная настройка PostgreSQL, отождествляющая пользователей операционной системы и базы данных, требует, чтобы от имени высочайшего пользователя postgres была дана команда
CREATE USER "wojcech" LOGIN;
Эту команду нужно подавать от имени администратора операционный системы, представившись как «postgres», что можно сделать через
sudo -u postgres psql;
Команда создания базы данных будет выглядеть примерно так
CREATE DATABASE "Tekstujo internacia" OWNER "wojcech" ENCODING UTF8 LC_COLLATE pl_PL.UTF8;
Данная команда создаст базу данных "Tekstujo internacia", что на эсперанто означает международное собрание текстов. Будет назначена международная многоалфавитная кодировка UTF8, позволяющая не задумываться о допустимых символах. Сортировка строк будет осуществляться по польскому алфавиту, что указано как «pl_PL.UTF8».
Для будущей работы с UUID2 нужно также набрать команду
CREATE EXTENSION "uuid-ossp";
Программный блок "uuid-ossp" содержит несколько небольших программ и поставляется чаще всего вместе с PostgreSQL.
После создания, пользователя, базы данных и группы функций для UUID нужно вернуться в обычный пользовательский режим и запустить там терминал, где набрать
psql -d "Tekstujo internacia" -U "wojcech";
Результатом этой команды будет начало общения с конкретной базой данной в PostgreSQL. Это общение происходит по очень похожим правилам, что и общение с SQLite. Правила эти называются языком формальным SQL. Он произошёл к концу 1980-х годов от более ранних разработок программистов, которые были основаны на английских литературных фразах. В настоящее время эта связь ослабла как формально, так и содержательно. Товаришка, академически специализирующаяся на английской литературе и прошедшая самообразовательный курс SQL в Германии утверждала, что знание SQL и литературного английского языка (или даже просто английской лексики) это весьма отдалённые навыки. Их объединение «имеет смысл не более чем чтение оригиналов проповедей Экхарта для лучшего освоения лексики Брехта». Или, для восточного читателя, изучать английскую лексику для лучшего понимания SQL это всё равно что читать Кирилла Туровского для лучшего освоения лексики из работ Ленина. Практика освоения SQL и практика освоения литературной английской лексики это принципиально разные практики. Потому аргументом против работы с SQL не может служить отсутствие знания английской лексики, а само это знание не может быть значительным облегчением освоения SQL. С лексической стороны современный SQL представляет из себя мешанину романской и германской лексики, применение которой в обращениях для разных задач определяется строгими правилами. Различные SQL ситуации подлежат запоминанию. Для этого лучше всего завести записной листок или файл, где все команды будут записываться по мере освоения с упоминанием той потребности, когда они нужны. Полноценную актуальную документацию для PostgreSQL или SQLite на польском языке довольно сложно найти. По-настоящему выручает только самообразовательный курс немецких коммунистов, медленная наработка опыта да консультации с замечательным комплектом документации https://docs.postgresql.fr/11/ с которым познакомил приехавший в Берлин французский товарищ.
Картотеки-таблицы
Понятие, наследующее канцелярское понятие картотеки это таблица, а понятие наследующее понятие карточки это запись или строка. В канцелярском деле карточке нередко предшествует печатная форма, создающая линии для вписывания. В работе табличных или реляционных баз данных появлению таблицы предшествует определение колонок, свойств или атрибутов (параллельная терминология).
Для международной базы данных естественно иметь список языков. Облегчение выбора языка обычно опирается на классификацию по языковым семьям. Простой понумерованный список языковых семей будет создаваться такой командой
CREATE TABLE "Lingva familioj" (
"Kodo" int NOT NULL,
"Nomo" varchar(32) NOT NULL
);
В этой команде таблица (картотека) под названием «Языковые семьи» "Lingva familioj" объявляется в составе Кода "Kodo" и Имени "Nomo". Вслед за названиями свойств приписаны их типы. Названия этих типов, некогда связанные с английскими названиями типовых полей бумажных карточек в настоящий момент очень сильно отделились как от следов канцелярского происхождения так и от какой-либо лексической нормативности, связанной с английским языком. Полная таблица стандартных типов для PostgreSQL находится по адресу https://docs.postgresql.fr/11/datatype.html , а SQLite проверку типов не производит. Некоторые основные типы присутствуют во всех распространённых табличных базах данных. Эти типы лучше всего запомнить
int - целые числа в пределах нескольких миллиардов. Обычно используются для нумерации и указания количества.
char(число) - знаковая группа строго из указанного количества символов. Обычно используется для разнообразных кодов. Так, например, польский почтовый индекс всегда имеет одинаковое количество символов.
varchar(число) - знаковая группа, не длиннее указанного количества символов. Например, аннотация к картине должна уместиться в несколько строк путеводителя, где есть место только для некоторого числа знаков.
real - дробное число.
text - описание неограниченной длины.
bool - да/нет. В просторечии называется флагом, поскольку важнейшие состояния произносятся как «поднят» (да) и «опущен»(нет).
timestamptz - дата и время, такие, что всякому будет показано его собственное местное время в данный момент. Этот тип используется чтобы понять что было раньше, а что было позже и чтобы не заниматься работой с часовыми поясами.
uuid - некое специально созданное значение, которое не должно повторяться никогда и которое имеет единственное предназначение - представлять свою строку (карточку), не будучи с ним никак связано по смыслу. Uuid это идеальный представитель, несущий в себе всеобщие свойства иного, но не имеющий их внутри себя. В этой роли uuid похож на номер с той разницей, что нумерация у разных карточек, описывающих разные вещи может повторяться, а правильно созданный uuid едва ли когда-либо совпадёт не только в рамках одной таблицы (картотеки), но и вообще в практике человечества.
Указанных типов вполне достаточно для того, чтобы хранить классические тексты так, как это было описано в схеме Фроша-Загорского-Радкевичюте.
Остаётся без объяснения что значит «NOT NULL» после названия и типа каждого свойства. Это указание на то, должны ли указанные свойства заполняться. В нашем случае оба свойства должны заполняться, или языковая семья без номера или языковая семья без названия это нечто бессмысленное. Если же свойство может оставаться без заполнения, то на месте «NOT NULL» не пишется ничего и сразу ставится «,» начинающая описание следующего свойства. Когда в табличных базах данных нечто не заполнено, то считается, что там находится некое специальное значение NULL, которое не является ни числом, ни датой, ни временем, ни флагом ни чем ещё другим. На польском языке есть название для NULL. Оно близко к слову «inconnu» из французской документации. Это полужаргонное выражение «нельзя знать», отсылающее к армейским порядкам периода тройного ига над Польшей. Похожими немецкими словами обычно выражают в популярной литературе смысл стройной математической концепции Эдгара Кодда, стоявшей за появлением этого необычного понятия, отражающего не заполненное поле. Пока что будет нужно подчеркнуть лишь, что для числового свойства NULL это не 0, для символьно-знакового свойства NULL это не отсутствие текста, а для флага NULL отличается от той ситуации, когда «квадратик отметок не заполнен», то есть когда bool свойство хранит «нет».
Как заполняются карточки?
Созданная таблица "Lingva familioj" ничего не хранит. Её польза возможна лишь после внесения сведений. В нашем случае команда записывается так
INSERT INTO "Lingva familioj" ("Kodo","Nomo") VALUES (1, 'Nigera-Konga');
Данная команда указывает на добавление сведений (INSERT INTO) именно в указанную таблицу ("Lingva familioj"). Далее в скобках перечисляются свойства, которые будут заполняться. Их порядок важен, ибо после «VALUES» в скобках в точно таком же порядке должны быть написаны сведения для размещения. В примере свойство "Kodo" записывается единицей, а свойство "Nomo" текстом 'Nigera-Konga' (на эсперанто это указывает на Нигеро-конголезскую языковую семью). Попытка сменить порядок вызовет ошибку
INSERT INTO "Lingva familioj" ("Nomo", "Kodo") VALUES (1, 'Nigera-Konga');
Целое число запишется в строку свойства "Nomo", а вот из строки 'Nigera-Konga' никак нельзя сделать целое число, чтобы оно стало номером.
Добавление сведений о других языковых семьях производится аналогично:
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (2, 'Dravidana');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (3, 'Kreola');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (4, 'Turka');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (5, 'Aŭstroasia');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (6, 'Tupia');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (7, 'Nordokcidenta Kaŭkaza');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (8, 'Izolita lingvoj');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (9, 'Sina-Tibeta');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (10, 'Hindeŭropa');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (11, 'Nila-Sahara');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (12, 'Keĉua');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (13, 'Afra-Asia');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (14, 'Tehnika');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (15, 'Suda Kaŭkaza');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (16, 'Eskimo-Aleŭta');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (17, 'Mongola');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (18, 'Nordorienta Kaŭkaza');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (19, 'Japona');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (20, 'Ajmara');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (21, 'Korea');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (22, 'Dené-Eniseia');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (23, 'Aŭstronesia');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (24, 'Tai-Kadai');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (25, 'Uralika');
INSERT INTO "Lingva familioj" ("Kodo", "Nomo") VALUES (26, 'Algonkia');
При работе с базой данных можно ожидать, что часто встречаться будут такие коды языковой семьи как 10 (индоевропейские), 14 (искусственные, к ним относится эсперанто), 25 (уральские, у ним относятся венгерский и финский языки), 4 (тюркские).
Код языковой семьи, хранящийся в нашей таблице позволяет однозначно получить название языковой семьи. Этот код будет указывать на языковую семью всюду, где нужно будет это указание. Поскольку наш код, являющийся условным номером всегда заполнен, то есть не может быть неизвестен (NULL) и никогда не повторяется, то его можно использовать как представителя всей карточки, которая в нашем случае содержит только название. Убыстрить поиск по номеру и указать на представительскую роль Кода в нашем случае можно назначив его первичным ключом. В математической теории по первичному ключу можно однозначно выйти на единственную запись-строку или убедиться, что такой строки нет. Знание ключа означает возможность знать остальное содержимое подобно номеру автомобиля или коду PESEL, которые выводят на конкретную личность.
ALTER TABLE "Lingva familioj" ADD CONSTRAINT PRIMARY KEY ( "Kodo"); -- (Данная команда не применима в SQLite)
Как именно используется первичный ключ и зачем он нужен станет лучше понятно когда таблица перестанет быть одинокой.
Карточки языков
CREATE TABLE "Lingvoj" (
"Nomo originala" text NOT NULL,
"Nomo" text,
"Familio" int NOT NULL,
"ISO 639-1" char(2),
"ISO 639-3" char(3) NOT NULL
);
Итак, типовая карточка языка включает в себя обязательное самоназвание("Nomo originala"). Как и следующее свойство оно объявлено как текст без ограничения длины. Вторым свойством является название на эсперанто("Nomo"), однако оно сделано не обязательным из тех соображений, что пока что не собраны названия всех приводимых ниже языков. Разумеется, в комплектной базе данных с интенсивной коллективной работой это поле должно быть заполнено для всех языков и помечено обязательным, однако зафиксированная ситуация должна остаться напоминанием о скверном состоянии международного взаимодействия.
Свойство "Familio" содержит целое число, которое рассматривается как код уже знакомой языковой семьи. Не было ли смысла хранить здесь всего лишь текстовое название языковой семьи? Зачем нужно было вводить коды, выполняющие функции идеального представителя? В трактатах Эдгара Кодда можно найти следующие доводы в пользу создание независимой таблицы и перемещения кода:
1. Языковая семья есть нечто отличное от языка. Её свойства принципиально отличны от свойств отдельного языка.
2. Имя языковой семьи при хранении в перечне языков будет повторено и не поддастся простому переименованию в одном месте, нужно будет проверять все случаи, а не один.
3. Добавление некоего свойства языковой семьи в карточку языка (не только названия, а, например, распространённости) прямо сделает хранение этого сведения дублирующимся, ибо это свойство будет продублировано у языков одной и той же семьи.
4. Дублирование кода как идеального представителя не создаёт проблем изменения свойств языковой семьи, ибо код не несёт этих свойств и нет никакого смысла менять код, если что-то сменилось в карточке языковой семьи.
Нужно специально оговориться, что существование кодов предполагает возможность их осмысления. Ибо идеальный представитель, не актуализируемый в деятельности является чисто материальным бесполезным предметом, подобно закопанным античным скульптурам. Разумеется актуализация кодов является весьма утомительной, однако в современных базах данных есть развитые средства, перекладывающие на себя расшифровку разнообразных кодов. Они будут упомянуты чуть ниже.
Свойство "ISO 639-1" в карточке языка представляет из себя двухбуквенный код из соответствующего международного стандарта. Эти коды должны быть известны читателю: de, pl, uk, es, ru, lv, fr, eo. Двухбуквенный код есть не у всех языков, имеющих трёхбуквенный код, поэтому это необязательное поле. Собственно, обязательный трёхбуквенный код всегда размещён в свойстве "ISO 639-3". Эти коды, возможно, менее популярны, но рекомендованы международной организацией по стандартам. В данном случае её лучше послушаться и привыкать к кодам типа deu, pol, rus, ukr.
В PostgreSQL будет весьма полезно объявить трёхбуквенные коды опознающий свойством, то есть обязательным и выводящим на единственную запись/строку/карточку.
ALTER TABLE "Lingva familioj" ADD CONSTRAINT "Lingvoj_pkey" PRIMARY KEY ("ISO 639-3"); -- (Данная команда не применима в SQLite)
После этой команды ввести несколько строк с повторяющимся трёхбуквенным кодом будет невозможно. Попытка сделать это будет приводить к сообщению об ошибке. В SQLite существует подобный механизм, но его несколько сложнее привести в действие. Командный порядок «ALTER TABLE ... ADD CONSTRAINT» в SQLite не работает3.
Кроме единственной записи с языковым кодом нужно гарантировать, что код языковой семьи формально правильный, то есть относится к списку кодов языковых семей. В данном случае формальной фразой связаны таблица "Lingvoj", её поле "Familio" с таблицей "Lingva familioj" и её полем "Kodo". Команда выглядит так:
ALTER TABLE "Lingvoj" ADD CONSTRAINT "Lingvoj_Lingva_familioj_FK" FOREIGN KEY ("Familio") REFERENCES "Lingva familioj"("Kodo"); -- (Данная команда не применима в SQLite)
Поскольку командный порядок «ALTER TABLE ... ADD CONSTRAINT» в SQLite не работает, для этой программы существует косвенный способ реализации ссылок4.
После создания предпосылок добавление языковых карточек можно сделать уже известным способом
INSERT INTO "Lingvoj" ("Nomo originala","Nomo","Familio","ISO 639-1","ISO 639-3") VALUES ('Esperanto','Esperanto',14,'eo','epo');
Однако есть способ упрощения массовой вставки. После директивы «VALUES» можно через запятую указывать несколько групп в скобках, где каждая группа превратится во вставленную строку/запись/карточку. Порядок в любом случае должен совпадать с тем, который указан в скобках до директивы «VALUES»:
INSERT INTO "Lingvoj" ("Nomo originala","Nomo","Familio","ISO 639-1","ISO 639-3") VALUES
('Deutsch','Germana',10,'de','deu')
,('Русский','Rusa',10,'ru','rus')
,('Español','Hispana',10,'es','spa')
,('Українська','Ukraina',10,'uk','ukr')
,('język polski, polszczyzna','Polona',10,'pl','pol')
,('latine, lingua latina','Latina',10,'la','lat');
Полный перечень языков, близкий к перечню Международной Организации по стандартам помещается в приложение.
Абзацы - основа системы текстологических работ
Причины по которым абзацы (таблица абзацев) были выбраны основой хранилища классических текстов не стоит здесь обсуждать. Это было сделано при обосновании базы данных по схеме Фроша-Загорского-Радкевичюте.
Таблица абзацев в первом приближении выглядит так
CREATE TABLE "Paragrafoj" (
"Kodo" uuid NOT NULL PRIMARY KEY,
"Laboro" uuid NOT NULL,
"Etikedo" varchar(32) NOT NULL,
"Klaso" varchar(64) NULL,
"Interno" text NULL
);
Абзац имеет собственный код("Kodo"), принадлежность к работе (код другой таблицы в "Laboro"), маркировку для гипертекста "Etikedo", класс для гипертекста "Klaso" и, главное, текстовое содержание "Interno". Пока что принципиально важно, что без каталога работ абзацы хранить бессмысленно. Следовательно нужно подготовить каталог работ:
CREATE TABLE "Laboroj" (
"Kodo" uuid NOT NULL PRIMARY KEY,
"Nomo originalo - lingvo" char(3) NOT NULL,
"Publikacio" date NOT NULL,
FOREIGN KEY("Nomo originalo - lingvo") REFERENCES "Lingvoj"("ISO 639-3")
);
Устроен каталог работ просто, он состоит из кода работы, кода языка на котором было дано название и даты публикации. Отдельно уже при создании каталога работ предусмотрено, что язык можно выбрать только из списка языков. Директива
FOREIGN KEY("Nomo originalo - lingvo") REFERENCES "Lingvoj"("ISO 639-3")
расшифровывается так, что свойство "Nomo originalo - lingvo" должно иметь только то значение, которое уже хранится в таблице "Lingvoj" и именно в её свойстве "ISO 639-3".
В карточке работы специально не содержится никаких названий. Принцип равноправия языков требует лишь указания языка оригинального названия. Но и оно указывается в общем перечне в другой таблице
CREATE TABLE "Laboroj - nomoj" (
"Laboro" uuid NOT NULL,
"Lingvo" char(3) NOT NULL,
"Nomo" text NOT NULL
);
В каталоге имён письменных произведений указывается код произведения, трёхбуквенный код языка и само название на указанном языке.
В системе международного общения произведения письменности получают переводы. Для элементарного примера нужно иметь возможность выразить происхождение перевода
CREATE TABLE "Laboroj - originaloj" (
"Laboro" uuid NOT NULL,
"Originalo" uuid NOT NULL,
"Lingvo" char(3) NOT NULL,
FOREIGN KEY("Lingvo") REFERENCES "Lingvoj"("ISO 639-3")
);
Эта таблица содержит код работы("Laboro"), код её языка"Lingvo" и код оригинальной работы "Originalo". С появлением таблицы "Laboroj - originaloj" можно создать пример международного текстологического хранилища, ибо появилась минимальная замкнутая система таблиц5.
Пример заполнения системы таблиц
В SQLite6
INSERT INTO "Laboroj" ("Kodo", "Nomo originalo - lingvo","Publikacio") VALUES (lower(hex(randomblob(16)))), 'fra', '1888');
В PostgreSQL
INSERT INTO "Laboroj" ("Kodo", "Nomo originalo - lingvo","Publikacio") VALUES (uuid_generate_v4(), 'fra', '1888-01-01');
Эти команды заполнили код произведения письменности. Нам нужно будет знать его для указания названия и переводов, для упоминания в каждом абзаце произведения. Узнать наш код может команда
SELECT "Kodo", "Nomo originalo - lingvo","Publikacio" FROM "Laboroj";
Эта команда выведет всё содержимое всех свойств из таблицы работ. На одной из строк (в нашем случае на единственной) будет нужный код. Допустим, он равен 488097c8-3f9c-4ecf-9d1d-64701ab9764c , тогда читатель должен будет применить свою непонятную последовательность вместо упоминаний «488097c8-3f9c-4ecf-9d1d-64701ab9764c».
Вносим переводы и оригинальное название (апостроф внутри цитаты удваивается, чтобы не быть концом цитаты).
INSERT INTO "Laboroj - nomoj" ("Laboro", "Lingvo", "Nomo") VALUES
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'fra', 'L''Internationale'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'epo', 'La Internacio (himno)'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'deu', 'Die Internationale'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'rus', 'Интернационал (гимн)'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'spa', 'La Internacional'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'ukr', 'Інтернаціонал (гімн)'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'pol', 'Międzynarodówka (pieśń)'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'bel', 'Інтэрнацыянал (гімн)'),
('488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'zho', '国际歌');
В международной текстологической базе данных разумный порядок наименования включает обязательные наименования на языке оригинала и на эсперанто, рекомендуемые наименования на мировых языках теоретического мышления (читатель мог заметить последовательность 'deu' - 'rus' - 'spa'), а затем дополнительные наименования на доступных читателю и других известных языках, например, языках ООН.
Создадим польский перевод, опубликованный в 1920 году.
В SQLite
INSERT INTO "Laboroj" ("Kodo", "Nomo originalo - lingvo","Publikacio") VALUES (lower(hex(randomblob(16)))), 'pol', '1920');
В PostgreSQL
INSERT INTO "Laboroj" ("Kodo", "Nomo originalo - lingvo","Publikacio") VALUES (uuid_generate_v4(), 'pol', '1920');
Пускай эта команда SELECT "Kodo", "Nomo originalo - lingvo","Publikacio" FROM "Laboroj"; показала нам новый код c01122df-18e4-4a78-a446-fbf7b8f2949b, тогда можно добавить точно такую же систему переводов, хотя в общем случае перевод может впервые появиться под названием, которое будет переводится на язык оригинала иначе, чем оригинальное название и, следовательно, подобного повтора не будет.
INSERT INTO "Laboroj - nomoj" ("Laboro", "Lingvo", "Nomo") VALUES
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'pol', 'Międzynarodówka (pieśń)'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'epo', 'La Internacio (himno)'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'deu', 'Die Internationale'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'rus', 'Интернационал (гимн)'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'spa', 'La Internacional'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'ukr', 'Інтернаціонал (гімн)'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'bel', 'Інтэрнацыянал (гімн)'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'fra', 'L''Internationale'),
('c01122df-18e4-4a78-a446-fbf7b8f2949b', 'zho', '国际歌');
В этой команде для подчёркивания регулярного порядка первой была указана карточка польского названия, однако для базы данных это не важно, ибо она хранит все языковые названия наравне.
Польский текст является переводом французского
INSERT INTO "Laboroj - originaloj" ("Laboro", "Lingvo", "Originalo") VALUES ('c01122df-18e4-4a78-a446-fbf7b8f2949b, 'pol', '488097c8-3f9c-4ecf-9d1d-64701ab9764c');
Как видим, подобные сложные указания формируются довольно лаконично. Когда у нас есть два указания на письменные произведения, уместно заполнить их содержимое.
Вместо *** здесь и далее нужно подставить функцию создающую UUID: для SQLite lower(hex(randomblob(16)))), а для PostgreSQL uuid_generate_v4().
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, '488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'p', NULL, 'Debout ! l''âme du prolétaire
Travailleurs, groupons-nous enfin.
Debout ! les damnés de la terre !
Debout ! les forçats de la faim !');
В данном случае как абзац во французский текст «Интернационала» внесён обычный гипертекстовый абзац ('p') без особого класса оформления (NULL), состоящий из четырёх стихотворных строк, разделённых гипертекстовым знаком переноса строки
. Апострофы внутри текста удвоены, чтобы программа управления базой данных не считала это место концом цитаты.
Аналогично добавляется другой абзац:
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, '488097c8-3f9c-4ecf-9d1d-64701ab9764c', 'p', NULL, 'Pour vaincre la misère et l''ombre
Foule esclave, debout ! debout !
C''est nous le droit, c''est nous le nombre :
Nous qui n''étions rien, soyons tout :');
Совершенно подобным образом добавляется польский текст
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, 'c01122df-18e4-4a78-a446-fbf7b8f2949b', 'p', NULL, 'Wyklęty, powstań ludu ziemi!
Powstańcie, których dręczy głód!
Myśl nowa blaski promiennemi
Dziś wiedzie nas na bój, na trud.');
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, 'c01122df-18e4-4a78-a446-fbf7b8f2949b', 'p', NULL, 'Przeszłości ślad dłoń nasza zmiata;
Przed ciosem niechaj tyran drży!
Ruszymy z posad bryłę świata,
Dziś niczem - jutro wszystkiem my!');
Связь абзацев и указание переводов - основа международного общения
В созданной системе хранения абзацев каждый отнесён к произведению письменности, а это произведение может оказаться переводом оригинала (или другого перевода, такое тоже бывает). Однако принципиально не это, а то, что порядок следования абзацев никак не указывается. Точно также абзацы перевода никак не связаны с абзацами оригинала. Для этих целей создаются две таблицы.
1. Таблица связей абзацев. "Antaŭa" - предшествующий, "Sekva" - последующий
CREATE TABLE "Paragrafoj - ĉenoj" (
"Antaŭa" uuid NOT NULL,
"Sekva" uuid NOT NULL
);
2. Таблица переводов абзацев, полностью аналогичная таблице переводов работ.
CREATE TABLE "Paragrafoj - originaloj" (
"Paragrafo" uuid NOT NULL,
"Lingvo" char(3) NOT NULL,
"Originalo" uuid NOT NULL
);
Инструкция-упражнение
С помощью команды
SELECT "Kodo", "Laboro", "Etikedo", "Klaso", "Interno" FROM "Paragrafoj";
выводится весь каталог абзацев.
1. В таблицу "Paragrafoj - ĉenoj" добавляется указание на то, что второй французский абзац следует за первым (коды размещаются в "Antaŭa" и предшествующий, "Sekva").
2. В таблицу "Paragrafoj - originaloj" вносится код первого польского абзаца с указанием на язык перевода и с указанием первого французского абзаца как оригинала.
3. В таблицу "Paragrafoj - originaloj" вносится код второго польского абзаца с указанием на язык перевода и с указанием второго французского абзаца как оригинала.
Выводы в конце
Совместная международная текстологическая база данных должна поощрить минимальное знание иных языков, необходимое для переводов названий и отождествления абзацев. Других средств решения задачи активизации международного теоретического общения до сих пор не было предложено в противовес нашему предложению. Разве может быть это общение организовано иначе, если оно рассматривается как систематическое и планомерное международное теоретическое взаимодействие. Думается, что в доступности оригинальных и подвергнутых выверке (текстологической критике) произведений заинтересованы в освободительном движении все. На этапе сообществ самообразования суть ведущейся работы наилучшим образом располагает к основательной текстологической проработке. Формирование агитационных и политических органов освободительного движения автоматически ставит иные задачи и оттесняет текстологические работы по обеспеченности кадрами. Однако успешная политическая работа принципиально невозможна, если ещё на этапе самообразования не было заложено знакомство с мировой теоретической литературой. Местные идеологии, тем более патриотической направленности или изоляционистские ещё нигде не приводили к хозяйственному и культурному процветанию и надёжному ходу от товарного хозяйства с принципами господства и подчинения к нетоварному хозяйству с принципом сотрудничества. Обращение к российскому читателю обусловлено в первую голову тем, что более никто не сможет формировать эталонную выверенную базу данных по ленинскому письменному наследию. Это обусловлено как тем, что в других странах нет должного количества носителей языка Ленина так и тем, что критическая выверка по лучшим известным изданиям не может быть делом узкой группы людей. Так отсутствие оригинальной абзацной структуры ленинских работ тормозит (хотя и не останавливает) поабзацную привязку немецкого и румынского варианта некоторых текстов. Подготовка эталонного поабзацного гипертекстового издания ленинских работ рассматривается как почётная обязанность российского самообразовательного сообщества. Ибо тем самым в нём во-первых будут выработаны здоровые силы, неспособные восторгаться империалистической политикой и во-вторых тем самым товарищам из других стран будет облегчена возможность сопоставить свои переводы ленинских работ с оригиналом с перспективной новых переводов или критических исследований уже существующих переводов.
Послесловие
Переводческий коллектив имеет разрешение на перевод и публикацию других частей конспекта немецких самообразовательных курсов по базам данных, адаптированного к раскрытию смысла базы данных по схеме Фроша-Загорского-Радкевичюте. Поэтому мы запрашиваем отклик заинтересованных читателей о том нужно ли продолжение, в какой форме оно должно быть и каковы недостатки настоящего изложения.
Практическое значение описанной базы данных состоит в принципиальной возможности7 создания лучших выверенных и многоязычных эталонных текстов классических письменных произведений, в повышении языковой культуры в обход популярных транзитных языков и в улучшении взаимной известности теоретических работ представителей разных народов.
Вместо эпилога
(команды требуют подстановки функции, создающей UUID)
INSERT INTO "Laboroj" ("Kodo", "Nomo originalo - lingvo","Publikacio") VALUES ('62e75f87-978b-4d9e-b587-bedcc2d23598', 'rus', NULL);
INSERT INTO "Laboroj - nomoj" ("Laboro", "Lingvo", "Nomo") VALUES
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'rus', 'Интернационал (гимн)'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'epo', 'La Internacio (himno)'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'deu', 'Die Internationale'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'spa', 'La Internacional'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'fra', 'L''Internationale'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'ukr', 'Інтернаціонал (гімн)'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'pol', 'Międzynarodówka (pieśń)'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'bel', 'Інтэрнацыянал (гімн)'),
('62e75f87-978b-4d9e-b587-bedcc2d23598', 'zho', '国际歌');
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, '62e75f87-978b-4d9e-b587-bedcc2d23598', 'p', NULL, 'Вставай, проклятьем заклеймённый,
Голодный, угнетённый люд!
Наш разум - кратер раскалённый,
Потоки лавы мир зальют.');
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, '62e75f87-978b-4d9e-b587-bedcc2d23598', 'p', NULL, 'Сбивая прошлого оковы,
Рабы восстанут, а затем
Мир будет изменён в основе:
Теперь ничто - мы станем всем!');
INSERT INTO "Laboroj" ("Kodo", "Nomo originalo - lingvo","Publikacio") VALUES ('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'rus', NULL);
INSERT INTO "Laboroj - nomoj" ("Laboro", "Lingvo", "Nomo") VALUES
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'ukr', 'Інтернаціонал (гімн)'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'epo', 'La Internacio (himno)'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'deu', 'Die Internationale'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'rus', 'Интернационал (гимн)'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'spa', 'La Internacional'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'fra', 'L''Internationale'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'pol', 'Międzynarodówka (pieśń)'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'bel', 'Інтэрнацыянал (гімн)'),
('30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'zho', '国际歌');
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, '30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'p', NULL, 'Повстаньте, гнані і голодні
Робітники усіх країв,
Як y вулкановій безодні
B серцях y нас клекоче гнів.');
INSERT INTO "Paragrafoj" ("Kodo", "Laboro", "Etikedo", "Klaso", "Interno") VALUES (***, '30ee70fa-2ff2-4ff5-b8ef-f99378272909', 'p', NULL, 'Ми всіх катів зітрем на порох
Повстань же, військо злидарів
Bce, що забрав наш лютий ворог
Щоб повернути, час наспів.');
____
ПРИЛОЖЕНИЕ №1
языковой справочник, близкий к ISO 639
за исключением некоторых языков, использовавшихся в примерах ранее
INSERT INTO "Lingvoj" ("Nomo originala","Nomo","Familio","ISO 639-1","ISO 639-3") VALUES
('Afaraf',NULL,13,'aa','aar')
,('аҧсуа бызшәа, аҧсшәа',NULL,7,'ab','abk')
,('Afrikaans',NULL,10,'af','afr')
,('Akan',NULL,1,'ak','aka')
,('አማርኛ',NULL,13,'am','amh')
,('العربية',NULL,13,'ar','ara')
,('aragonés',NULL,10,'an','arg')
,('অসমীয়া',NULL,10,'as','asm')
,('авар мацӀ, магӀарул мацӀ',NULL,18,'av','ava')
,('avesta',NULL,10,'ae','ave')
,('aymar aru',NULL,20,'ay','aym')
,('azərbaycan dili',NULL,4,'az','aze')
,('башҡорт теле',NULL,4,'ba','bak')
,('bamanankan',NULL,1,'bm','bam')
,('беларуская мова',NULL,10,'be','bel')
,('বাংলা',NULL,10,'bn','ben')
,('Bislama',NULL,3,'bi','bis')
,('བོད་ཡིག',NULL,9,'bo','bod')
,('bosanski jezik',NULL,10,'bs','bos')
,('brezhoneg',NULL,10,'br','bre')
,('български език',NULL,10,'bg','bul')
,('català, valencià',NULL,10,'ca','cat')
,('čeština, český jazyk',NULL,10,'cs','ces')
,('Chamoru',NULL,23,'ch','cha')
,('нохчийн мотт',NULL,18,'ce','che')
,('ѩзыкъ словѣньскъ',NULL,10,'cu','chu')
,('чӑваш чӗлхи',NULL,4,'cv','chv')
,('Kernewek',NULL,10,'kw','cor')
,('corsu, lingua corsa',NULL,10,'co','cos')
,('ᓀᐦᐃᔭᐍᐏᐣ',NULL,26,'cr','cre')
,('Cymraeg',NULL,10,'cy','cym')
,('dansk',NULL,10,'da','dan')
,('ދިވެހި',NULL,10,'dv','div')
,('རྫོང་ཁ',NULL,9,'dz','dzo')
,('eesti, eesti keel',NULL,25,'et','est')
,('euskara, euskera',NULL,8,'eu','eus')
,('Eʋegbe',NULL,1,'ee','ewe')
,('føroyskt',NULL,10,'fo','fao')
,('فارسی',NULL,10,'fa','fas')
,('vosa Vakaviti',NULL,23,'fj','fij')
,('suomi, suomen kieli',NULL,25,'fi','fin')
,('Frysk',NULL,10,'fy','fry')
,('Fulfulde, Pulaar, Pular',NULL,1,'ff','ful')
,('Gàidhlig',NULL,10,'gd','gla')
,('Gaeilge',NULL,10,'ga','gle')
,('Galego',NULL,10,'gl','glg')
,('Gaelg, Gailck',NULL,10,'gv','glv')
,('Avañe''ẽ',NULL,6,'gn','grn')
,('ગુજરાતી',NULL,10,'gu','guj')
,('Kreyòl ayisyen',NULL,3,'ht','hat')
,('(Hausa) هَوُسَ',NULL,13,'ha','hau')
,('עברית',NULL,13,'he','heb')
,('Otjiherero',NULL,1,'hz','her')
,('हिन्दी, हिंदी',NULL,10,'hi','hin')
,('Hiri Motu',NULL,23,'ho','hmo')
,('hrvatski jezik',NULL,10,'hr','hrv')
,('magyar',NULL,25,'hu','hun')
,('Հայերեն',NULL,10,'hy','hye')
,('Asụsụ Igbo',NULL,1,'ig','ibo')
,('Ido',NULL,14,'io','ido')
,('ꆈꌠ꒿ Nuosuhxop',NULL,9,'ii','iii')
,('ᐃᓄᒃᑎᑐᑦ',NULL,16,'iu','iku')
,('Interlingue/Occidental',NULL,14,'ie','ile')
,('Interlingua',NULL,14,'ia','ina')
,('Bahasa Indonesia',NULL,23,'id','ind')
,('Iñupiaq, Iñupiatun',NULL,16,'ik','ipk')
,('Íslenska',NULL,10,'is','isl')
,('Italiano',NULL,10,'it','ita')
,('ꦧꦱꦗꦮ, Basa Jawa',NULL,23,'jv','jav')
,('日本語 (にほんご)',NULL,19,'ja','jpn')
,('kalaallisut, kalaallit oqaasii',NULL,16,'kl','kal')
,('ಕನ್ನಡ',NULL,2,'kn','kan')
,('कश्मीरी, كشميري',NULL,10,'ks','kas')
,('ქართული',NULL,15,'ka','kat')
,('Kanuri',NULL,11,'kr','kau')
,('қазақ тілі',NULL,4,'kk','kaz')
,('ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ',NULL,5,'km','khm')
,('Gĩkũyũ',NULL,1,'ki','kik')
,('Ikinyarwanda',NULL,1,'rw','kin')
,('Кыргызча, Кыргыз тили',NULL,4,'ky','kir')
,('коми кыв',NULL,25,'kv','kom')
,('Kikongo',NULL,1,'kg','kon')
,('한국어',NULL,21,'ko','kor')
,('Kuanyama',NULL,1,'kj','kua')
,('Kurdî, کوردی',NULL,10,'ku','kur')
,('ພາສາລາວ',NULL,24,'lo','lao')
,('latviešu valoda',NULL,10,'lv','lav')
,('Limburgs',NULL,10,'li','lim')
,('Lingála',NULL,1,'ln','lin')
,('lietuvių kalba',NULL,10,'lt','lit')
,('Lëtzebuergesch',NULL,10,'lb','ltz')
,('Kiluba',NULL,1,'lu','lub')
,('Luganda',NULL,1,'lg','lug')
,('Kajin M̧ajeļ',NULL,23,'mh','mah')
,('മലയാളം',NULL,2,'ml','mal')
,('मराठी',NULL,10,'mr','mar')
,('македонски јазик',NULL,10,'mk','mkd')
,('fiteny malagasy',NULL,23,'mg','mlg')
,('Malti',NULL,13,'mt','mlt')
,('Монгол хэл',NULL,17,'mn','mon')
,('te reo Māori',NULL,23,'mi','mri')
,('Bahasa Melayu, بهاس ملايو',NULL,23,'ms','msa')
,('ဗမာစာ',NULL,9,'my','mya')
,('Dorerin Naoero',NULL,23,'na','nau')
,('Diné bizaad',NULL,22,'nv','nav')
,('isiNdebele',NULL,1,'nr','nbl')
,('isiNdebele',NULL,1,'nd','nde')
,('Owambo',NULL,1,'ng','ndo')
,('नेपाली',NULL,10,'ne','nep')
,('Nederlands, Vlaams',NULL,10,'nl','nld')
,('Norsk Nynorsk',NULL,10,'nn','nno')
,('Norsk Bokmål',NULL,10,'nb','nob')
,('Norsk',NULL,10,'no','nor')
,('chiCheŵa, chinyanja',NULL,1,'ny','nya')
,('occitan, lenga d''òc',NULL,10,'oc','oci')
,('ᐊᓂᔑᓈᐯᒧᐎᓐ',NULL,26,'oj','oji')
,('ଓଡ଼ିଆ',NULL,10,'or','ori')
,('Afaan Oromoo',NULL,13,'om','orm')
,('ирон æвзаг',NULL,10,'os','oss')
,('ਪੰਜਾਬੀ',NULL,10,'pa','pan')
,('पाऴि',NULL,10,'pi','pli')
,('Português',NULL,10,'pt','por')
,('پښتو',NULL,10,'ps','pus')
,('ελληνικά','Greka',10,'el','ell')
,('English','Angla',10,'en','eng')
,('français, langue française','Franca',10,'fr','fra')
,('Runa Simi, Kichwa',NULL,12,'qu','que')
,('Rumantsch Grischun',NULL,10,'rm','roh')
,('Română',NULL,10,'ro','ron')
,('Ikirundi',NULL,1,'rn','run')
,('yângâ tî sängö',NULL,3,'sg','sag')
,('संस्कृतम्',NULL,10,'sa','san')
,('සිංහල',NULL,10,'si','sin')
,('Slovenčina, Slovenský Jazyk',NULL,10,'sk','slk')
,('Slovenski Jezik, Slovenščina',NULL,10,'sl','slv')
,('Davvisámegiella',NULL,25,'se','sme')
,('gagana fa''a Samoa',NULL,23,'sm','smo')
,('chiShona',NULL,1,'sn','sna')
,('सिन्धी, سنڌي، سندھی',NULL,10,'sd','snd')
,('Soomaaliga, af Soomaali',NULL,13,'so','som')
,('Sesotho',NULL,1,'st','sot')
,('Shqip',NULL,10,'sq','sqi')
,('sardu',NULL,10,'sc','srd')
,('српски језик',NULL,10,'sr','srp')
,('SiSwati',NULL,1,'ss','ssw')
,('Basa Sunda',NULL,23,'su','sun')
,('Kiswahili',NULL,1,'sw','swa')
,('Svenska',NULL,10,'sv','swe')
,('Reo Tahiti',NULL,23,'ty','tah')
,('தமிழ்',NULL,2,'ta','tam')
,('татар теле, tatar tele',NULL,4,'tt','tat')
,('తెలుగు',NULL,2,'te','tel')
,('тоҷикӣ, toçikī, تاجیکی',NULL,10,'tg','tgk')
,('Wikang Tagalog',NULL,23,'tl','tgl')
,('ไทย',NULL,24,'th','tha')
,('ትግርኛ',NULL,13,'ti','tir')
,('Faka Tonga',NULL,23,'to','ton')
,('Setswana',NULL,1,'tn','tsn')
,('Xitsonga',NULL,1,'ts','tso')
,('Türkmen, Түркмен',NULL,4,'tk','tuk')
,('Türkçe',NULL,4,'tr','tur')
,('Twi',NULL,1,'tw','twi')
,('ئۇيغۇرچە, Uyghurche',NULL,4,'ug','uig')
,('اردو',NULL,10,'ur','urd')
,('Oʻzbek, Ўзбек, أۇزبېك',NULL,4,'uz','uzb')
,('Tshivenḓa',NULL,1,'ve','ven')
,('Tiếng Việt',NULL,5,'vi','vie')
,('Volapük',NULL,14,'vo','vol')
,('Walon',NULL,10,'wa','wln')
,('Wollof',NULL,1,'wo','wol')
,('isiXhosa',NULL,1,'xh','xho')
,('ייִדיש',NULL,10,'yi','yid')
,('Yorùbá',NULL,1,'yo','yor')
,('Saɯ cueŋƅ, Saw cuengh',NULL,24,'za','zha')
,('中文 (Zhōngwén), 汉语, 漢語',NULL,9,'zh','zho')
,('isiZulu',NULL,1,'zu','zul');
____
1 Лишь весьма редкая разовая настройка некоторых важных параметров требует во многих программах управления базами данных редактирования текстовых файлов. К особенностям функций этих программ как автоматизации труда канцеляриста или делопроизводителя эти настройки обычно не имеют прямого отношения.
2 Специальные неповторяющиеся коды, которые можно создавать не имея общего списка таких кодов где-либо и будучи уверенным что такого кода нет больше ни у кого.
3 Для испытаний нужно уничтожить таблицу "Lingva familioj", пересоздать её и перезаполнить. Такова цена простой структуры SQLite.
DROP TABLE "Lingva familioj";
CREATE TABLE "Lingva familioj2" (
"Kodo" int PRIMARY KEY,
"Nomo" varchar(32) NOT NULL
);
После этого повторить все команды INSERT, указанные выше.
Нетрудно заметить, что методологически программа SQLite ориентирована на то, что таблица-картотека будет создана уже со всеми подробными деталями, которые в будущем не поменяются. Причины такого перфекционистского подхода состоят в том, что SQLite не задумывалась как средство коллективной работы, где трудно сразу предугадать все мелкие детали. SQLite как программа управления базой данных работает с единственным местным файлом и не предназначена для коллективной работы. То есть SQLite аналогичен личному секретарю-канцеляристу, тогда как другие программы управления базами данных (Oracle, DB2, MariaDB, Firebird, PostdreSQL, MySQL) работают с сетевыми механизмами и аналогичны организатору обмена справками, либо коллективному делопроизводителю. Аналогия с работой министерств Народной Польши может быть продуктивно развита намного глубже, если читателю знакома эта область деятельности.
4 Для испытаний нужно уничтожить таблицу "Lingvoj" и пересоздать её. Такова цена простой структуры SQLite.
DROP TABLE "Lingvoj";
CREATE TABLE "Lingvoj" (
"Nomo originala" text NOT NULL,
"Nomo" text,
"Familio" int NOT NULL,
"ISO 639-1" char(2),
"ISO 639-3" char(3) NOT NULL
);
После этого повторить все команды INSERT, указанные выше.
5 Замкнутой системой таблиц называется в данном случае группа таблиц, которая вместе полностью выражает некоторую сферу. В нашем случае исключение таблицы названий произведения делает систему таблиц бессмысленной, ибо сведения о произведении без названия бесполезны. С точки зрения учёта авторства и поиска по авторам или учёта издательств наша система таблиц не замкнута, однако поскольку эти возможности не рассматривалась, а система таблиц уже оказалась осмыслена то учёт авторства и издательств может рассматриваться как ближайшее усовершенствование, которое не отнимает смысла у имеющейся системы таблиц.
6 Эта команда не создаёт полноценные UUID, соответствующие стандарту в отношении неповторимости, однако для испытаний и уяснения сути работы в текстологической базе данных это не нужно.
7 Эта возможность реализуется в навыках общего и веб-программирования, которые обходятся вниманием поскольку нет возможности привлечь соответствующих специалистов к изложению проблем программирования для базы данных по схеме Фроша-Загорского.
Часть 3 http://propaganda-journal.net/10402.html
Часть 4 http://propaganda-journal.net/10412.html
Часть 5. http://propaganda-journal.net/10421.html
Речи к представителям самообразовательных теоретических сообществ о воспитательном значении текстологической работы.
Речь 1 http://propaganda-journal.net/10313.html
Речь 2 http://propaganda-journal.net/10316.html
Речь 3. http://propaganda-journal.net/10319.html