繁体   English   中英

ASP.net和SQL 2008:当值具有不同的数量而不是在整个行中重复时,为列表存储多个值的最佳方法是什么?

[英]ASP.net & SQL 2008: What is the best way to store multiple values for lists when values are of varying amounts and not repeated throughout rows?

我正在使用ASP.net和SQL 2008为学校创建一个Web应用程序。我有一个页面供用户查看课程说明。 课程描述的一部分将包括所涵盖主题的列表。 每个课程的主题都不同,每个课程都会有不同的主题。 我最终将数据绑定到转发器中的有序列表。 我还需要在Web应用程序上提供搜索功能。 在SQL中存储这些主题的最优雅和规范化的方法是什么? 我想避免编写VB或使用客户端脚本。

我考虑过:

•在名为topics的字段中输入以逗号分隔的值。 我不想以编程方式为转发器分隔值,我不确定它是否是DB的优雅解决方案。

•对名为topics的字段使用XML数据类型。 我认为它可能没有必要,而且比它需要的更复杂。

•使用PK和名为topics的字段为每个课程创建单独的表。 我不想创建所有这些表!

不试图懒惰只是效率!

在设计数据库时,它有助于从核心对象/实体开始工作,然后查看它们之间的相互关系。 还可以尝试使用规范化表,在需要之前永远不要去标准化。 在上面的示例中,您有课程,主题和用户,虽然上述问题不包括用户,因此我们将其留在一边。

我首选的方法是尽量保持解决方案尽可能简单。 除非绝对必要,否则不要尝试使用花哨的解决方案。 因此,我不会使用XML,因为它不需要。

您的逗号分隔解决方案未规范化,并将导致重复问题,以及添加和删除值。

每个课程的单独表格效率不高,并且会创建一个重复的表格结构,这将使维护非常困难,因为它会扩展。

那么,回到问题,你如何建模主题和课程。

我会做的事情如下:

CREATE TABLE Topics (
    topic_id INT IDENTITY(1,1) PRIMARY KEY,
    name VARCHAR(255),
    description VARCHAR(1023)
);

CREATE TABLE Courses (
    course_id INT IDENTITY(1,1) PRIMARY KEY,
    name VARCHAR(255),
    description VARCHAR(1023)
);

这允许您在课程中为用户创建关系,以及在多个课程之间共享主题。

我会通过创建一个连接表来做到这一点

CREATE TABLE Course_Topics (
    course_id INT REFERENCES Courses (course_id),
    topic_id INT REFERENCES Topics (topic_id),
    PRIMARY KEY (course_id, topic_id)
);

然后,您可以使用这些表,并将数据直接绑定到.net中的控件,以解决问题。

您的选项3是在关系数据库中执行此操作的常规方法。 只需要一个表来保存所有主题 - 您的模式就像是

CREATE TABLE Course (
   CourseId INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Course PRIMARY KEY
   -- Other fields
)

CREATE TABLE CourseTopic (
    CourseTopicId INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_CourseTopic PRIMARY KEY
    CourseId INT CONSTRAINT FK_CourseTopic_Course FOREIGN KEY REFERENCES Couse(CourseId),
    Topic NVARCHAR(50)
)

所以你可以为每门课程提供很多主题。 总共只有2张桌子。 如果您有大量共享主题,则可能有一个单独的主题表,然后CourseTopic将只保存课程的ID和主题的ID,而主题的文本将放在主题表中,但它在这种情况下听起来可能有些过分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM