Я пишу небольшой и простой API, чтобы абстрагироваться от Web SQL, indexedDB и, возможно, даже localStorage / JSON. API позволит программисту рассматривать базу данных как небольшую реляционную базу данных, даже если фактически используемая база данных является indexedDB или структурой данных localStorage / JSON.
Я не знаю, существует ли «стандартный» способ сделать это, но у меня структура базы данных должна быть представлена как реляционная база данных, которая определена в схеме XML. Я думаю, что конечный продукт будет выглядеть так: xsd -> xml (следует схеме, определяет db) -> javascript api -> (indexeddb / wwebsql / localStorage-JSON). Отличная идея? Имейте в виду, что производительность можно настроить внутри API. То есть я знаю, что indexedDB не является реляционной базой данных и что для некоторых, представляющих ее как таковую, это нечестивый UNION, но сам API будет работать с indexedDB способом indexedDB и Web SQL в стиле Web SQL.
Сказав это, я представляю вам свою схему. Я хочу, чтобы это было очень просто. Как можно проще. Можете ли вы что-нибудь улучшить? Одна вещь, которую я хотел бы добавить, - это определенный тип поля. Так что поле может иметь тип атрибута, но это могут быть только определенные значения (строка, число, blob, w / e).
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- DATABASE -->
<xs:element name="database">
<xs:complexType>
<xs:choice>
<!-- TABLE-->
<xs:element name="table" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:choice>
<!-- FIELD -->
<xs:element name="field" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="pk" type="xs:boolean"/>
<xs:attribute name="fk" type="xs:string"/>
<xs:attribute name="unique" type="xs:boolean"/>
<xs:attribute name="index" type="xs:boolean"/>
<xs:attribute name="indentity" type="xs:boolean"/>
<xs:attribute name="maxSize" type="xs:long"/>
</xs:complexType>
</xs:element>
<!-- END FIELD -->
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<!-- END TABLE -->
</xs:choice>
<xs:attribute name="version" type="xs:double" use="required"/>
</xs:complexType>
</xs:element>
<!-- END DATABASE -->
</xs:schema>