我有一个存储一些值的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方法更好,你有没有这样的示例代码?
发布于 2019-01-18 15:51:36
你的问题是有争议的。
这取决于你对数据模型的态度。你可以拧紧螺丝,就像你的问题中那样,或者你可以稍微松开它,然后创建键值结构。
根据您在问题中提供的内容,我会使用key-value。维护一个有3列的表要比维护18列的表容易得多。这样,您就可以轻松地更改表,而不必编写和维护包含所有这些字段的Settings实体。
但可以肯定的是,您必须记住,在某些情况下,值应该(或不应该)为null,并且您必须将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
}https://stackoverflow.com/questions/54238179
复制相似问题