【问题标题】:What's the best way to keep bad words into database entity?将坏词保留到数据库实体中的最佳方法是什么?
【发布时间】:2011-11-10 17:39:43
【问题描述】:

我有一些用于放置在外部网站上的网络应用程序。这个应用程序是一个像 disqus (disqus.com) 这样的 cmets 的小部件。

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

@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 还是其他?

【问题讨论】:

  • 关于单词过滤器的主题,你的方法不起作用,你必须在语音上匹配单词这是一个非常重要的问题要解决

标签: java database hibernate jpa widget


【解决方案1】:

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

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

将所有单词放在一个集合中(第一种方式)将允许轻松查询它们,并使所有 CRUD 操作更简单。

【讨论】:

  • 那如何将坏词作为一个表(新实体),并将这个实体与小部件关联为 ManyToMany(而不是 ElementCollection)?这将减少坏词进入数据库表的数量。
  • @user647919 是的,这是可能的。这取决于您的应用程序需要什么。拥有多对多可能需要针对坏词使用特定的 CRUD。现在取决于您的实施。
【解决方案2】:

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

它更干净。还有很多很多不好的词。

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

【讨论】:

  • 你的意思是第一种方式 (Set badWords= new HashSet()) 吗?
  • @user647919 是的,一组或一个列表。但这比你想象的要难——有很多方法可以“伪装”坏词,比如 a$$hole、dikchead、milf、d-bag 等。然后你必须考虑外来词,比如 pendejo ,你买买买,等等。祝你好运!
猜你喜欢
  • 2016-05-19
  • 2016-09-30
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多