首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在关系数据库中使用键值结构进行存储设置

在关系数据库中使用键值结构进行存储设置
EN

Stack Overflow用户
提问于 2019-01-17 22:35:02
回答 1查看 295关注 0票数 0

我有一个存储一些值的settings表。

代码语言:javascript
复制
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方法更好,你有没有这样的示例代码?

EN

回答 1

Stack Overflow用户

发布于 2019-01-18 15:51:36

你的问题是有争议的。

这取决于你对数据模型的态度。你可以拧紧螺丝,就像你的问题中那样,或者你可以稍微松开它,然后创建键值结构。

根据您在问题中提供的内容,我会使用key-value。维护一个有3列的表要比维护18列的表容易得多。这样,您就可以轻松地更改表,而不必编写和维护包含所有这些字段的Settings实体。

但可以肯定的是,您必须记住,在某些情况下,值应该(或不应该)为null,并且您必须将String转换为Integer,反之亦然。

因此,尽管如此,您的液基将类似于:

代码语言:javascript
复制
<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>

和你的实体:

代码语言:javascript
复制
@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

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54238179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档