Реляционные базы данных: структура базы данных / поток - PullRequest
1 голос
/ 24 апреля 2020

Я использую Entity Framework для настройки базы данных. Я новичок в реляционных базах данных и пытаюсь определить правильный способ настройки нескольких таблиц и их отношений. Вот s coop.

Скажем, у меня есть три таблицы в моей базе данных.

Основная таблица - это таблица A, в которой содержится набор данных для объекта. Давайте назовем этот объект Food. Столбцы: FoodID (первичный ключ), RecipeID (внешний ключ, связанный с его рецептом в таблице C).

Таблица C: содержит записи для рецептов, используемых для хранения различных Food элементов в таблице А. Столбцы: RecipeID (первичный ключ) и имя рецепта.

Таблица B: является записью инструкции / рецепта для создания Food. Столбцы: EntryID (первичный ключ), RecipeID (внешний ключ, ссылающийся на идентификатор рецепта в таблице C), FoodID (внешний ключ, ссылающийся на еду в таблице A).

Я не могу обернуться вокруг правильный способ сделать это, так как это создает циклическое отношение.

Должен ли я просто удалить внешний ключ (RecipeID) из таблицы Food? Какой правильный поток я должен преследовать в подобных ситуациях.

 Recipes -> Multiple Recipe Entries -> Food -> Recipe

Food требуется рецепт для его изготовления, но Food используется в рецептах для изготовления других Food.

Концептуализация данных в C# код, который будет выглядеть вот так.

public class Food
{
    public int FoodID { get; set; }
    public string Name { get; set; }
    public List<Food> Recipe { get; set; }
}

Модель Entity Framework будет выглядеть следующим образом.

public class Food
{
    [Key]
    public int FoodID { get; set; }//Pri Key
    public string Name { get; set; }
    public int FoodRecipeID { get; set; }//Foreign Key

    public virtual FoodRecipe FoodRecipe { get; set; }//Navigation Property
}

public class FoodRecipeEntry
{
    [Key] 
    public int FoodRecipeEntryId { get; set; } //Pri Key
    public string Name { get; set; }
    public int FoodID { get; set; }//Foreign Key
    public int FoodRecipeID { get; set; }

    //Navigation Properties
    public Food Food { get; set; }
    public FoodRecipe FoodRecipe { get; set; }
}

public class FoodRecipe
{
    [Key]
    public int FoodRecipeID { get; set; } //Pri Key
    public string Name { get; set; }
    public virtual ICollection<FoodRecipeEntry> FoodRecipeEntries {get; set; }//Navigation Property
}

1 Ответ

0 голосов
/ 24 апреля 2020

Вот несколько указателей:

  1. Удалите идентификатор еды из FoodRecipeEntry, FoodID подразумевается рецептом, так как рецепт предназначен для определенного c продукта, и запись принадлежит данный рецепт
  2. Я бы лично положил внешний ключ в рецепт, а не в еду - у одного продукта может быть несколько рецептов, поэтому он должен быть Рецепт -> Еда

В коде это будет выглядеть так:

public class Food
{
    [Key]
    public int FoodID { get; set; }//Pri Key
    public string Name { get; set; }

    public virtual FoodRecipe FoodRecipe { get; set; }//Navigation Property
}

public class FoodRecipeEntry
{
    [Key] 
    public int FoodRecipeEntryId { get; set; } //Pri Key
    public string Name { get; set; }

    [ForeignKey("FoodRecipe")] // Personally I prefer using explicit foreign key attributes to avoid implicit jankiness
    public int FoodRecipeID { get; set; }

    [ForeignKey("Ingredient")]
    public int IngredientID { get; set; }

    //Navigation Properties
    public virtual FoodRecipe FoodRecipe { get; set; }


    public virtual Food Ingredient { get; set; }
}

public class FoodRecipe
{
    [Key]
    public int FoodRecipeID { get; set; } //Pri Key
    public string Name { get; set; }
    [ForeignKey("Food")] // Personally I prefer using explicit foreign key attributes to avoid implicit jankiness
    public int FoodID { get; set; }//Foreign Key
    public virtual Food Food { get; set; }
    public virtual ICollection<FoodRecipeEntry> FoodRecipeEntries {get; set; }//Navigation Property
}
...