導入
データベース設計は、ソフトウェア開発において重要なスキルの一つです。特に、ビジネスロジックやデータの整合性を保つために、適切な設計が求められます。ここでは、C#を用いた具体的なデータベース設計のケーススタディを通じて、実務に役立つ知識を深めていきます。
教科書レベルの解説(データベース設計)
重要な概念の整理
データベース設計においては、エンティティ、リレーションシップ、正規化といった概念が基本です。特に、エンティティ間の関係を適切に定義することが、データの整合性やクエリの効率に大きな影響を与えます。例えば、顧客情報と注文情報のリレーションシップを考慮する際、顧客が一つの注文を持つのか、複数の注文を持つのかを明確にする必要があります。
コード例(C#)
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
public class DatabaseExample
{
private string connectionString;
public DatabaseExample(string connectionString)
{
this.connectionString = connectionString;
}
public void AddCustomer(string name, string email)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string query = "INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@Email", email);
command.ExecuteNonQuery();
}
}
}
}
コードの行ごとの解説
- using System; – 基本的なクラスやメソッドを使用するための名前空間をインポートします。
- public class DatabaseExample – データベース操作を行うクラスを定義します。
- private string connectionString; – データベース接続に必要な接続文字列を保持します。
- public DatabaseExample(string connectionString) – コンストラクタで接続文字列を初期化します。
- public void AddCustomer(string name, string email) – 新しい顧客をデータベースに追加するメソッドです。
- using (SqlConnection connection = new SqlConnection(connectionString)) – SQL Serverへの接続を確立します。
- connection.Open(); – データベースへの接続を開きます。
- string query = “INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)”; – SQLクエリを定義します。
- using (SqlCommand command = new SqlCommand(query, connection)) – SQLコマンドを準備します。
- command.Parameters.AddWithValue(“@Name”, name); – SQLインジェクション対策として、パラメータを追加します。
- command.ExecuteNonQuery(); – SQLコマンドを実行し、データを挿入します。
練習問題編
以下の練習問題に取り組んでみてください。
-
問題1: 顧客テーブルに電話番号を追加するSQL文を作成してください。
模範解答: ALTER TABLE Customers ADD PhoneNumber VARCHAR(15);
-
問題2: 顧客のメールアドレスを一意にするための制約を追加するSQL文を作成してください。
模範解答: ALTER TABLE Customers ADD CONSTRAINT UQ_Email UNIQUE (Email);
-
問題3: 特定の顧客の情報を更新するC#メソッドを作成してください。
模範解答:
public void UpdateCustomerEmail(int customerId, string newEmail) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string query = "UPDATE Customers SET Email = @Email WHERE Id = @Id"; using (SqlCommand command = new SqlCommand(query, connection)) { command.Parameters.AddWithValue("@Email", newEmail); command.Parameters.AddWithValue("@Id", customerId); command.ExecuteNonQuery(); } } } -
問題4: 新しい顧客を追加する際に、メールアドレスが重複している場合の処理を追加してください。
模範解答:
public void AddCustomerWithCheck(string name, string email) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string checkQuery = "SELECT COUNT(*) FROM Customers WHERE Email = @Email"; using (SqlCommand checkCommand = new SqlCommand(checkQuery, connection)) { checkCommand.Parameters.AddWithValue("@Email", email); int count = (int)checkCommand.ExecuteScalar(); if (count == 0) { AddCustomer(name, email); } else { throw new Exception("Email already exists."); } } } } -
問題5: 顧客情報を取得するC#メソッドを作成してください。
模範解答:
public Customer GetCustomer(int customerId) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string query = "SELECT * FROM Customers WHERE Id = @Id"; using (SqlCommand command = new SqlCommand(query, connection)) { command.Parameters.AddWithValue("@Id", customerId); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { return new Customer { Id = (int)reader["Id"], Name = reader["Name"].ToString(), Email = reader["Email"].ToString(), PhoneNumber = reader["PhoneNumber"].ToString() }; } } } } return null; }
まとめ
- データベース設計は、ビジネスロジックとデータの整合性を保つために重要です。
- C#を用いたデータベース操作の具体例を通じて、実務に役立つスキルを身につけることができます。