#ms-access
#ms-access
Вопрос:
Я разрабатываю базу данных Access, которая в сочетании с библиотекой классов C # позволит мне хранить и извлекать объекты с произвольными типами данных. База данных будет вести себя примерно как хранилище EAV (Entity / Attribute / Value), где запись для каждого значения будет ссылаться на имя сущности, имя атрибута и тип данных (а также фактические данные, хранящиеся в виде сериализованной строки JSON (Javascript Object Notation).
Из-за особенностей базы данных я буду использовать одни и те же строки снова и снова. Например, многие записи будут иметь строку «System.Double» хранится в поле типа данных. Поэтому я думаю об экономии места путем записи этих строк в таблицу с автоинкрементным целочисленным первичным ключом, который будет использоваться вместо прямого использования строк. Так, например, вместо того, чтобы иметь…
CREATE TABLE [Value] (
...
[DataTypeName] VARCHAR NOT NULL,
...);
… Я бы так и сделал…
CREATE TABLE [Name] (
[NameID] AUTOINCREMENT PRIMARY KEY,
[NameValue] VARCHAR NOT NULL UNIQUE);
CREATE TABLE [Value] (
...
[DataTypeNameID] INTEGER NOT NULL REFERENCES [Name],
...);
Будет ли это хорошим подходом, или в базах данных Access встроено сжатие строк для повторяющихся строк?
Комментарии:
1. Я бы сказал, что «поддерживаемые типы данных» являются частью кода, а не частью пользовательских данных. Таким образом, я бы предложил третий подход: в вашем коде определите перечисление, содержащее все поддерживаемые вами типы данных (т. Е. Те, В которых ваша библиотека знает, как их упорядочивать / разархивировать), и просто сохраните значение перечисления в базе данных.
2. @Heinzi дело в том, что поддерживаемые типы данных могут и будут меняться с течением времени, что привело меня к этому методу хранения данных. Использование значения enum будет просто запутанным, поскольку потенциально будут храниться сотни различных типов данных.
3. Я вижу, имеет смысл. Я действительно считаю, что ваш метод «кэширования» типов данных сэкономит место (т. Е. В Access нет встроенного сжатия строк), но это всего лишь интуиция, поэтому я с нетерпением жду ответа на ваш вопрос. В любом случае помните о высказывании «преждевременная оптимизация — корень всего зла» — достаточно ли велика разница, чтобы иметь значение на практике (и стоит усилий и дополнительной сложности)?
4. @Heinzi: «Access не имеет встроенного сжатия строк» — по иронии судьбы, движок имеет сжимаемые текстовые типы данных начиная с Jet 4.0 около 2000 года.
5. например, @onedaywhen позволяет избежать «грязных» данных из-за ошибок в написании одного и того же значения, например ‘System. Double’ и ‘System-Double’, если задействован какой-либо ручной ввод данных; это расширяет возможности использования элементов формы доступа, таких как поля со списком; он предоставляет индекс допустимых значений.