将坏词保留在数据库实体中的最佳方法是什么?

时间:2011-11-10 17:39:43

标签: java database hibernate jpa widget

我有一些网络应用程序可以放置在外部网站上。此应用程序是disqus(disqus.com)等评论的小部件。

在应用程序中,每个小部件都是一个具有许多属性的实体对象。 例如:

@Entity
class Widget {

    private User admin;        //same as owner, administrator, creator

    private String site;       //example.com

    private String providers;  //google_plus,facebook,twitter,lastfm and others

    //... and a lot of many other attributes
}

现在我开发了坏词列表。此列表将由管理员窗口小部件(所有者)管理。

对于这项任务,我有两种实现方式:

第一种方式:

@Entity
class Widget {

    ...
    @ElementCollection(fetch = FetchType.LAZY)
    @Column(name = "bad_words", length = 20)
    private Set<String> badWords= new HashSet<String>();
    ...
}

在第二个表中保持关系

第二种方式:

@Entity
class Widget {

    ...
    @Column(name = "bad_words", length = 2000)
    private String badWords;
    ...
}

将字符串保留为由某些分隔符分割的单词,例如:“fukc,azz,shitt,...”

所以问题是在每个小部件实体中保留坏词的最佳方法是什么?案例1,2或其他一些事情?

2 个答案:

答案 0 :(得分:1)

绝对选项1.选项2违反了First Normal Form

考虑在第二种方式中将所有单词连接起来进行讨论。查询表会遇到很多困难。此外,还会出现许多用于更新/删除/添加单词的糟糕代码。你不想要任何这个。

拥有集合中的所有单词(First Way)将允许轻松查询它们并使所有CRUD操作更简单。

答案 1 :(得分:1)

IMO你应该保留一个单独的坏词列表,而不是将它们全部塞进一列。

它更干净。还有一个很多的坏词。

如果每个小部件确实需要自己的坏词列表,我会保持原样。但是,如果坏词列表总是相同,我不会将它们直接与小部件相关联,而是将列表保持为单独的实体。