2

interests生徒ごとに学校の科目の表があります。

学生は少なくとも3つの主題の興味を持っている必要があり、最大7つまでです

考えられる主題の関心は次のとおりです。

  • 理科
  • 算数
  • 英語
  • 歴史
  • 美術
  • 体育
  • 外国語

ただし、どちらのテーブルデザインでも、テーブルを正規化する方法がわかりません。


最初のテーブル:interests(8列)

student_id(pk) | interest_1 | interest_2 | ... | interest_7

この設計では、 interests_1tointerest_7は列です。学生が興味として科学、数学、英語を選択した場合、

  • interest_1に設定されていますscience
  • interest_2に設定されていますmath
  • interest_3に設定されていますenglish
  • interest_4interest_7設定されていますnull

2番目のテーブル:interests(8列)

student_id(pk) | science | math | english | ... | foreign_lanaguage

この設計では、学校の科目が列になりました。学生の興味が科学、数学、英語である場合、それらの列はに設定されtrue、残りの列はに設定されfalseます。

  • scienceに設定されていますtrue
  • mathに設定されていますtrue
  • englishに設定されていますtrue
  • historyに設定されていますfalse
  • artに設定されていますfalse
  • physical_educationに設定されていますfalse
  • foreign_languageに設定されていますfalse

このテーブルを他にどのように設計できますか?

また、特定の学生が興味を持っている科目のみを選択するにはどうすればよいですか?

4

3 に答える 3

3

それは本当にあなたがどれだけスケーラブルになりたいかに依存します。一方では、あなたのデザインは機能します。

一方、新しいクラスを追加する場合は、テーブルにアクセスして変更する必要があります。

別のアプローチは、3つのテーブルを持つことです。

学生 証、氏名

クラス ID、名前

StudentInterrests ID、StudentID、ClassID

学生クラスの組み合わせがstudentinterrestsテーブルに表示されない場合、それらはコースに関心がありません。

選択した学生の興味は次のようになります。

SELECT StudentName, CourseName
FROM Student
LEFT JOIN StudentInterrests ON Student.ID = StudentInterrests.StudentID
LEFT JOIN Class ON StudentInterrests.ClassID = Class.ID

これによる結果は次のようになります:
John、Math
John、English
John、SocialStudies

最小要件と最大要件の場合:データベースの制約よりもアプリケーションロジックの方が多いように思われるため、要件をアプリケーションレベルに置くことをお勧めします。

于 2012-11-10T01:38:44.987 に答える
0

さて、あなたの要件を満たすためにあなたのデザインはうまくいくでしょう。与えられた仕様を満たすことができる他の2つの簡単に実装できるオプションがあります。

1.)インタレストテーブルに外部キーが設定された7つのインタレストを持つ学生テーブル。一連の一意の制約を使用して、同じ興味を持つ2つの生徒がいないことを確認します。null許容外部キーを使用し、項目4〜7でnullを許可します。

2.)利害関係の表を分割します。ルールは99%同じように機能しますが、必須の関心は、関心が選択された場合にのみ制約をトリガーします(したがって、学生は0または3〜8の関心を持つことができます)。これはもう少し合理的なアプローチであるため、興味とは別に学生テーブルにデータを入力できます。これにより、物事を拡張可能に保つことができます。

どちらのアプローチも、ANSI-92準拠のデータベースで実行可能な第3正規形です。SQLサーバーでの#2の実装例を以下に示します。

テーブルレイアウト

USE [DB]
GO
/****** Object:  Table [dbo].[Interests]    Script Date: 11/9/2012 8:32:39 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Interests](
    [interestID] [int] IDENTITY(1,1) NOT NULL,
    [interestText] [varchar](255) NOT NULL,
    [interestDescription] [varchar](max) NULL,
 CONSTRAINT [PK_Interests] PRIMARY KEY CLUSTERED 
(
    [interestID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[StudentInterests]    Script Date: 11/9/2012 8:32:39 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[StudentInterests](
    [studentInterestID] [int] IDENTITY(1,1) NOT NULL,
    [studentID] [int] NOT NULL,
    [interestID_1] [int] NOT NULL,
    [interestID_2] [int] NOT NULL,
    [interestID_3] [int] NOT NULL,
    [interestID_4] [int] NULL,
    [interestID_5] [int] NULL,
    [interestID_6] [int] NULL,
    [interestID_7] [int] NULL,
    [interestID_8] [int] NULL,
 CONSTRAINT [PK_StudentInterests] PRIMARY KEY CLUSTERED 
(
    [studentInterestID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_1] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_2] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_3] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_3] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_4] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_5] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_5] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_6] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_6] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_7] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_7] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_8] UNIQUE NONCLUSTERED 
(
    [studentInterestID] ASC,
    [interestID_8] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_StudentInterests_9] UNIQUE NONCLUSTERED 
(
    [studentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[Students]    Script Date: 11/9/2012 8:32:39 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Students](
    [studentID] [int] IDENTITY(1,1) NOT NULL,
    [firstName] [varchar](255) NOT NULL,
    [lastName] [varchar](255) NOT NULL,
 CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED 
(
    [studentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests] FOREIGN KEY([interestID_1])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests1] FOREIGN KEY([interestID_2])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests1]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests2] FOREIGN KEY([interestID_3])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests2]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests3] FOREIGN KEY([interestID_4])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests3]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests4] FOREIGN KEY([interestID_5])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests4]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests5] FOREIGN KEY([interestID_6])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests5]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests6] FOREIGN KEY([interestID_7])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests6]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Interests7] FOREIGN KEY([interestID_8])
REFERENCES [dbo].[Interests] ([interestID])
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Interests7]
GO
ALTER TABLE [dbo].[StudentInterests]  WITH CHECK ADD  CONSTRAINT [FK_StudentInterests_Students] FOREIGN KEY([studentID])
REFERENCES [dbo].[Students] ([studentID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[StudentInterests] CHECK CONSTRAINT [FK_StudentInterests_Students]
GO
于 2012-11-10T02:34:19.687 に答える
0

正規化するときは、作成する各テーブルの正しい主キーを認識することが重要です。フィールドを最も基本的な形式に分割します。何がありますか?あなたにはstudent_idと興味があります。インタレストはtrueまたはfalseのいずれかである可能性があるため、インタレストの名前を他のインタレストと同じ列に格納できます。したがって、student_idに対してそれらが存在しない場合、その学生はそれらに関心がありません。

これは宿題の質問に隣接しているので、これを解決するのはばかげているようです。代わりに、私はあなたを正しい軌道に乗せます。student_idは探している主キーではありませんが、インデックスです。最も理想的なデータ構造の3列のテーブルを取得しようとしています。

于 2012-11-10T01:36:11.053 に答える