代码之家  ›  专栏  ›  技术社区  ›  user366312

我应该何时考虑表示主键…?

  •  3
  • user366312  · 技术社区  · 15 年前

    我应该在什么时候考虑将主键表示为 classes ?

    当表使用复合键时,我们应该只将主键表示为类吗?

    例如:

    public class PrimaryKey
        { ... ... ...}
    

    然后

    private PrimaryKey _parentID;
            public PrimaryKey ParentID
            {
                get { return _parentID; }
                set { _parentID = value; }
            }
    

    public void Delete(PrimaryKey id)
            {...}
    

    什么时候应该考虑将数据存储为DB表中的列中的逗号分隔值,而不是将它们存储在不同的列中?

    6 回复  |  直到 15 年前
        1
  •  8
  •   Oded    15 年前

    When should I consider representing the table-id columns as classes?

    在不了解应用程序体系结构的情况下更难回答。如果使用诸如nhibernate或linq-to-sql之类的ORM,它们将自动为您创建类。

    一般来说-如果您的主键是一个复合的并且在您的域中有意义,那么为它创建一个类。

    如果它不是复合的,就不需要类。

    如果它在您的域中没有意义,就很难证明类的合理性(如果创建类,我可能会使用结构而不是类,因为它是一个值类型)。我使用它的唯一原因是,如果需要像代码中那样使用密钥,并且通常不需要单独访问组成部分。

    When should I consider storing data as comma-separated values in a column in a DB table rather than storing them in different columns? .

    从未。你应该保留你的桌子 normalized ,所以不同的列和表对应不同的数据。在这方面,使用逗号分隔是不好的做法,特别是考虑到SQL中对文本操作的支持非常差。

        2
  •  1
  •   Wael Dalloul    15 年前

    我应该什么时候考虑代理 表ID列是否为类?

    什么意思?

    我应该什么时候考虑将数据存储为 以逗号分隔的列中的值 数据库表,而不是将它们存储在 不同的列?

    根据 Normalization Rules 不应在同一列中存储多个值。

        3
  •  1
  •   p.marino    15 年前

    字段中逗号分隔的值(或任何其他类似的技巧)是一种糟糕的做法,经常被用作权宜之计(即,当更改数据模型为时已晚时,您发现需要多个值)或一些遗留的错误。

    通过在字段中对多值进行“加密”,您将失去RDBMS模型的所有好处:特别是,如果不可能与其他数据一起使用,则很难在逗号分隔字段中查找/排序/比较值。

        4
  •  1
  •   Carl    15 年前

    在几乎所有情况下,都应该将每个逗号分隔的值存储在自己的列中。这使SQL选择能够按特定的逗号分隔值筛选行。

    例如,如果每个代表每月销售额的表行(1-12月)有12个逗号分隔的值,那么将数字存储在12列中可以进行操作;例如:返回8月份销售额大于10万美元的所有行。如果有一个将所有12个值“填充”到一个列中,那么需要返回所有行,并对每一行的列进行分析,以提取8月份的数据。

    一个可以考虑“填充”的例子…其中逗号分隔的数据集中的值不能与另一行的数据相关或进行比较。

    例如,在多项选择问卷中,答案将是一个或多个选项。如果问题的正确答案是选项A和选项B,第二个问题的正确答案是选项B和选项C,那么可以考虑将每个答案填充到一列中。在这个例子中,如果一个人接受了答案,就可以存储“b,c”和“b&c”,而不需要进行相互比较。

        5
  •  1
  •   flq    15 年前

    唯一的情况是 可以 考虑使用自定义类作为“主键”对使用复合键的旧数据库使用或/m。

        6
  •  0
  •   Dustin Laine    15 年前

    一开始不确定你在找什么。我创建业务对象作为映射到我的数据层(通常是包含数据的数据表)的类。

    第二个问题是永远不会。在很少的情况下,我会存储一个逗号分隔的列表,而不是创建一个规范化的数据结构。