Использовать структуру ключ-значение в реляционной базе данных для настроек магазина - PullRequest
0 голосов
/ 17 января 2019

У меня есть таблица settings, в которой хранятся некоторые значения.

CREATE TABLE `setting` (
  `uuid` binary(16) NOT NULL,
  `p1` int(11) NOT NULL,
  `p2` int(11) NOT NULL,
  `p3` int(11) NOT NULL,
  `p4` int(11) NOT NULL,
  `p5` varchar(32) NOT NULL,
  `p6` varchar(8) DEFAULT NULL,
  `p7` varchar(255) NOT NULL,
  `p8` varchar(8) NOT NULL,
  `p9` int(11) NOT NULL,
  `p10` int(11) NOT NULL,
  `p11` int(11) NOT NULL,
  `p12` int(11) NOT NULL,
  `p13` int(11) NOT NULL,
  `p14` int(11) NOT NULL,
  `p15` varchar(32) NOT NULL,
  `p16` varchar(8) NOT NULL,
  `p17` varchar(64) NOT NULL,
   PRIMARY KEY (`uuid`)
)

Эта таблица settings содержит только одну строку. Лучше, если я буду использовать key-value структуру для хранения settings значений таблицы? Если я использую key-value подход, я должен преобразовать int значение в String и наоборот. Я могу изменить столбцы таблицы в будущем. Какой подход имеет лучшее обслуживание? какой подход имеет лучшую производительность? Мое приложение написано на Spring Boot, и я использую Liquibase для переноса базы данных.

Примечание: значение этой таблицы в моем приложении высоко.

Если подход key-value лучше, у вас есть пример кода для этого?

1 Ответ

0 голосов
/ 18 января 2019

Ваш вопрос является дискуссионным.

Это зависит от вашего отношения к модели данных. Вы можете затянуть винты и сделать это, как это было в вашем вопросе, или вы можете немного ослабить его и создать структуру ключ-значение.

Из того, что вы указали в своем вопросе, я бы выбрал ключ-значение. Поддерживать таблицу с тремя столбцами проще, чем с 18 столбцами. Таким образом, вы можете легко изменять таблицу, и вам не нужно будет писать и поддерживать объект Settings со всеми этими полями.

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

Так что, тем не менее, ваша жидкость будет выглядеть примерно так:

<changeSet id="foo1" author="bar">
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="settings"/>
        </not>
    </preConditions>
    <comment>Create settings table.</comment>
    <createTable tableName="settings">
        <column name="uuid" type="binary(16)">
            <constraints primaryKey="true" primaryKeyName="pk_settings"/>
        </column>
        <column name="key" type="varchar(3)">
            <constraints nullable="false"/>
        </column>
        <column name="value" type="varchar(255)"/>
    </createTable>
</changeSet>

    <changeSet id="foo2" author="bar">
    <preConditions onFail="MARK_RAN">
        <and>
            <columnExists tableName="settings" columnName="uuid"/>
            <columnExists tableName="settings" columnName="key"/>
            <columnExists tableName="settings" columnName="value"/>
        </and>
    </preConditions>
    <comment>Fill settings table with data.</comment>
    <sql>
        INSERT INTO settings (uuid, key, value) VALUES (uuid(), 'p1', 'value-you-need');
        INSERT INTO settings (uuid, key, value) VALUES (uuid(), 'p2', 'value-you-need');

        <!-- ... etc ... -->

    </sql>
</changeSet>

А ваша сущность:

@Entity
@Table(name = "settings")
public class Settings {

    @Id
    @Column(name = "uuid")
    private String uuid;

    @Column(name = "key")
    private String key;

    @Column(name = "value")
    private String value;

    // getters and setters

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...