Как спроектировать базу данных с пользовательским редактируемым / версионным контентом, используя Code First? - PullRequest
0 голосов
/ 05 октября 2010

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

Я работаю с EF4 и новым кодомПервый подход в последней CTP, так какой же дизайн класса будет лучшим для этого?

мое текущее предположение примерно такое:

public class VersionableText
{
   public int Id { get; set; }
   public DateTime Date{ get; set; }
   public String Text{ get; set; }

   public virtual User User{ get; set; }  
}

, а затем использовать его в других моих сущностях,в таком контексте это может быть что-то вроде этого

public class Question
{
   public int Id {get; set;}
   public virtual VersionableText Title {get; set;}
   public virtual VersionableText Content{get; set;}
   ...
}

Но я не очень уверен в этом ... так как у меня также будут теги, возможность удаления / восстановления сообщений, откат и т. д.Знаете ли вы, как правильно проектировать классы, которые помогают мне правильно корректировать контент?

1 Ответ

1 голос
/ 05 октября 2010

Стремитесь к простоте

Главный вопрос, который вам нужно задать себе: Собираетесь ли вы показывать все версии постоянно или самую последнюю версию большую часть времени и все они по запросу? Похоже здесь. В большинстве случаев вы видите только последнюю версию.

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

Я бы предпочел такой класс:

public class Question
{
    public int Id { get; set; }
    public QuestionStatus Status { get; set; }
}

public class QuestionHistory
{
    public Question Question { get; set; }

    public string Title { get; set; }
    public string Content { get; set; }

    public User Author { get; set; }

    public DateTime Created { get; set; }

    public IList<Tag> Tags { get; set; }
}

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

...