我什么时候应该考虑代表主键......?

时间:2010-03-08 08:29:47

标签: c# sql

我应该何时考虑将主键表示为classes

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

例如:

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

然后

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

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

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

6 个答案:

答案 0 :(得分:8)

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

如果不了解您的应用程序架构,则难以回答。如果您使用ORM(如nhibernate或linq to sql),它们将自动为您创建类。

一般情况下 - 如果您的主键是复合词并且在您的域中具有意义,请为其创建一个类。

如果它不是复合词,则不需要课程。

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

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中相当糟糕的文本操作支持。

答案 1 :(得分:1)

  

我应该何时考虑代表   table-id列为类?

你是什​​么意思?

  

我应该何时考虑将数据存储为   以逗号分隔的值   数据库表而不是存储它们   不同的栏目?

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

答案 2 :(得分:1)

字段中的逗号分隔值(或任何其他类似的技巧)是不好的做法,并且经常使用或作为权宜之计(即,当更改数据模型为时已太晚时,您发现需要多值)或一些遗产。

通过在字段中“加密”多值,您将失去拥有RDBMS模型的所有好处:特别是您可以在逗号分隔字段中查找/排序/比较值(如果不是不可能的话)其余的数据。

答案 3 :(得分:1)

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

例如,如果每个表行的12个逗号分隔值可用于表示每月销售额(1月至12月),则将数字存储在12列中可以进行操作;如:返回8月销售的所有行> $ 100,000.00。如果将所有12个值“填充”到一个列中,则需要返回所有行,并为每行解析列以提取8月数字。

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

例如,在多项选择问卷中,答案将是一个或多个选项。给出一个正确答案的问题是选项A&选项B和第二个问题,正确答案选项B&选项C然后可以考虑将每个答案填充到一个列中。在这个例子中,如果一个人接受没有必要的案例来比较答案,那么就可以存储“B,C”和“B& C”。

答案 4 :(得分:1)

可能考虑使用自定义类作为“主键”的唯一情况是对使用复合键的旧数据库使用OR / M.

答案 5 :(得分:0)

首先不确定你在寻找什么。我将业务对象创建为映射到我的数据层的类,该数据层通常是包含数据的数据表。

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