TypeScript上級

上級 TypeScriptで学ぶデータベース設計|練習問題編

導入

データベース設計は、システム全体のパフォーマンスや保守性に大きな影響を与える要素です。特に、複雑なビジネスロジックを扱う上級エンジニアにとって、効率的なデータモデルの構築は避けて通れない課題です。この記事では、TypeScriptを用いたデータベース設計の具体的なシチュエーションを考え、実務に役立つ視点を提供します。

教科書レベルの解説(データベース設計)

重要な概念の整理

データベース設計には、正規化やER図の作成、インデックスの活用など、さまざまな概念があります。ここでは、特に「正規化」を中心に取り扱います。正規化は、データの冗長性を排除し、整合性を保つための手法です。特に、1NF(第一正規形)から3NF(第三正規形)までの理解は、設計の基礎となります。

コード例(TypeScript)


interface User {
    id: number;
    name: string;
    email: string;
}

interface Post {
    id: number;
    userId: number;
    title: string;
    content: string;
}

const users: User[] = [
    { id: 1, name: "Alice", email: "alice@example.com" },
    { id: 2, name: "Bob", email: "bob@example.com" }
];

const posts: Post[] = [
    { id: 1, userId: 1, title: "First Post", content: "Hello World!" },
    { id: 2, userId: 2, title: "Second Post", content: "TypeScript is great!" }
];

// ユーザーに関連する投稿を取得する関数
function getUserPosts(userId: number): Post[] {
    return posts.filter(post => post.userId === userId);
}

コードの行ごとの解説

  1. interface User: ユーザー情報を表すインターフェースを定義。
  2. interface Post: 投稿情報を表すインターフェースを定義。
  3. const users: ユーザーの配列を初期化。
  4. const posts: 投稿の配列を初期化。
  5. function getUserPosts: 特定のユーザーIDに基づいて、そのユーザーの投稿をフィルタリングして取得する関数。

練習問題編

以下に、データベース設計に関する練習問題をいくつか用意しました。各問題に対する模範解答と解説も併せて記載します。

問題1

ユーザーが作成した投稿を取得する関数を改良し、投稿が存在しない場合には適切なメッセージを返すようにしてください。

模範解答


function getUserPosts(userId: number): Post[] | string {
    const userPosts = posts.filter(post => post.userId === userId);
    return userPosts.length > 0 ? userPosts : "投稿がありません";
}

解説

フィルタリングした結果が空である場合に、適切なメッセージを返すように条件分岐を追加しました。

問題2

ユーザーのメールアドレスを更新する関数を作成してください。

模範解答


function updateUserEmail(userId: number, newEmail: string): string {
    const user = users.find(user => user.id === userId);
    if (user) {
        user.email = newEmail;
        return "メールアドレスが更新されました";
    }
    return "ユーザーが見つかりません";
}

解説

ユーザーIDに基づいてユーザーを検索し、見つかった場合はメールアドレスを更新します。

問題3

投稿のタイトルを更新する関数を作成してください。

模範解答


function updatePostTitle(postId: number, newTitle: string): string {
    const post = posts.find(post => post.id === postId);
    if (post) {
        post.title = newTitle;
        return "タイトルが更新されました";
    }
    return "投稿が見つかりません";
}

解説

投稿IDに基づいて投稿を検索し、見つかった場合はタイトルを更新します。

まとめ

  • データベース設計は、システム全体のパフォーマンスに影響を与える。
  • 正規化を理解し、データの冗長性を排除することが重要。
  • TypeScriptを使った実践的な例を通じて、データベース設計の理解を深める。