如何在列映射

时间:2017-07-09 01:29:13

标签: database-design enums

我们假设我们有2个实体(用户和个人资料):

User {
    ID INT NOT NULL,
    STATUS CHAR(5) NOT NULL
}
Profile {
    ID INT NOT NULL,
    STATUS CHAR(5) NOT NULL
}

我会将我的实体映射为:

public class User {
    @Id private Integer id;
    private Status status;
}
public class Profile {
    @Id private Integer id;
    private Status status;
}
public enum Status {
    ACTIVE, INACTIVE, BLOCKED, SUSPENDED, PENDING;
}
@Converter( autoApply = true )
public class StatusConverter implements AttributeConverter<Status,String> {
    // Converter methods omitted for brevity
}

既然它有效,我相信到现在为止一切都还好。 某些状态在许多实体中是等效的,例如ACTIVE,但是某些状态不等于另一个实体状态。例如,用户可以具有BLOCKED状态,但我们从未拥有阻止的配置文件(但我们有一个非活动的配置文件)。

现在我有一些问题希望得到你的帮助:

  1. 我应该为每个实体创建一个枚举(如UserStatus和ProfileStatus),这样每个实体都拥有自己的&#34;状态&#34;?如果是的话,我应该在哪里放置枚举?在用户实体(User.Status)或某个特定包(com.example.enums.UserStatusEnum)?
  2. 我应该像表Status { ID INT NOT NULL, CODE CHAR(5) }一样映射它并让应用程序管理它吗?或者甚至创建一个新列(ENTITY CHAR(5))来指定状态对应的实体?
  3. 更改枚举以使其具有一个属性来指定它的实体?
  4. 我不清楚我应该遵循的路径。你有其他建议吗?

    请记住,可以有更多实体,每个实体具有不同的状态集。但这些状态经常不会改变,所以我真的不相信我需要在我的数据库上有一个表格。

1 个答案:

答案 0 :(得分:0)

仅从应用程序端设计实体。然后设计一个匹配的数据库模式来保存它们 - 因此数据库完全从属于应用程序。

避免&#34;重复使用&#34;像身份一样的实体也许今天不同实体的状态一致,但明天他们不会。此外,某些实体可能只被允许拥有状态子集。你很快就陷入了混乱。并保存什么?几行和一些小桌子。不值得。

创建单独的枚举,例如UserStatus。忽略实体之间共享某些状态值的事实。