何时应该考虑表示主键?涉及IT技术相关内容。

3

何时应该将主键表示为

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

例如:

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

那么

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

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

在何时,我应该考虑将数据以逗号分隔的形式存储在数据库表的一列中,而不是存储在不同的列中?


1
通常ID是一些INT或GUID。为什么你要定义自己的?请解释一下。 - Brian Leahy
6个回答

8

何时应该将表ID列表示为类?

如果不知道您的应用程序架构,很难回答这个问题。如果使用像nhibernate或linq to sql这样的ORM,则会自动为您创建类。

一般来说,如果您的主键是复合键并在您的领域中具有含义,则应创建一个类。

如果它不是复合键,则不需要类。

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

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

永远都不应该这样做。您应该保持表规范化,使用不同的列和表来存储不同的数据。在这方面使用逗号分隔是不好的实践,特别是考虑到SQL中相当差的文本操作支持。


但是我见过一些软件组织使用这种技术。 - user366312
7
我看到过人们驾驶着粉色法拉利车。但这并不代表是正确的行为。 - CResults
还有一件事我需要知道,如果您能告诉我就好了。如果我使用ID列,我是否需要使用复合键? - user366312
如果您的主键是ID键,则它不是复合键。请阅读有关复合键的内容:http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx - Oded

1
什么时候我应该考虑将表ID列表示为类?
你是什么意思?
根据规范化规则,您不应在同一列中存储多个值。

1

在字段中使用逗号分隔的值(或任何类似的技巧)是不良实践,通常是作为权宜之计(即当您发现需要多个值时,已经太晚更改数据模型),或者是一些遗留问题。

通过在字段中“加密”多个值,您失去了拥有RDBMS模型的所有好处:特别是,如果无法与其余数据一起使用,则使在逗号分隔的字段中查找/排序/比较值变得困难甚至不可能。


1
在几乎所有情况下,应将每个逗号分隔的值存储在自己的列中。这使得SQL选择可以按特定逗号分隔的值过滤行。
例如,如果每个表行代表每月销售额(1月至12月)有12个逗号分隔的值可用,则将数字存储在12个列中使操作变得容易;例如:返回所有8月销售额> $100,000.00的行。如果将所有12个值都塞到单个列中,则需要返回所有行并解析每行以提取8月份的数字。
一个例子是“stuffing”可能被考虑的地方...当逗号分隔的数据集中的值不能与另一行的数据相关或比较时。
例如,在多项选择问卷中,答案将是一个或多个选项。给定一个正确答案为OPTION A和OPTION B的问题和第二个问题的正确答案为OPTION B和OPTION C,则可以考虑将每个答案都塞到单个列中。在这个例子中,如果接受没有必要将答案彼此比较,则可以存储“B,C”和“B&C”。

1

唯一我可能考虑使用自定义类作为“主键”的情况是使用ORM与使用复合键的遗留数据库进行交互。


0

关于第一个问题,我不确定你在寻找什么。我将业务对象创建为类,映射到我的数据层,通常是包含数据的数据表。

至于第二个问题,从来没有过。很少有情况下我会存储逗号分隔的列表,而不是创建规范化的数据结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接