SQLite / C #: проектирование сущности, являющейся дочерним элементом многих родительских сущностей - PullRequest
1 голос
/ 24 ноября 2010

У меня есть эти отношения:

1 Period has N Documents
1 Pupil has N Documents
1 Report has N Documents

Это мои объекты C #:

class Period
{
   public int PeriodId {get;set;}   
   public List<Document> Documents {get;private set;}
}

class Pupil
{
   public int PupilId {get;set;}   
   public List<Document> Documents {get;private set;}
}

class Period
{
   public int ReportId {get;set;}  
   public List<Document> Documents {get;private set;} 

}

class Document
{
   public int DocumentId {get;set;}

   // ??? 
   public int PeriodId {get;set;}
   public int PupilId {get;set;}
   public int ReportId {get;set;} 

   // ??? OR just a general Foreign-Key Id like
   public int Id_FK {get;set;}
}

Проблема заключается в следующем:

Когда у меня есть документ сPeriodId 33 есть вероятность, что у меня также может быть PupilId 33, потому что обе таблицы используют первичный ключ / автоинкремент.Таким образом, может быть ученик И точка с идентификатором 33. Выполняя ВНУТРЕННЕЕ СОЕДИНЕНИЕ для обеих таблиц, я бы возвратил 2 документа из моего запроса sqlite, хотя я должен получить ТОЛЬКО ONE .

Как бы вы решили это?

Ответы [ 2 ]

1 голос
/ 25 ноября 2010

Сначала определите свой ERD для SQLite, а после этого все правильно, затем вы можете выполнить объектно-реляционное отображение в C #. У вас есть четыре основных объекта, для каждого из которых требуется таблица в SQLite: Документ, Ученик, Период, Отчет. И тогда вам нужен способ выразить тот факт, что каждая сущность (строка) в каждой из этих трех таблиц может быть связана с одним или несколькими документами. Как сказал Мартин, это делается с помощью таблицы соединений "junction".

Теперь, в C #, если вы хотите иметь денормализованный объект с именем Document, вы можете сделать это:

class Document
{
   public int DocumentId {get;set;}

   // ??? 
   public int PeriodId {get;set;}
   public int PupilId {get;set;}
   public int ReportId {get;set;} 

   // ??? OR just a general Foreign-Key Id like
  public int Id_FK {get;set;}
}

только если документ может быть связан с одним и только одним Периодом, одним и только одним Учеником и одним и только одним Отчетом. Если документ может быть связан с более чем одной из этих сущностей, эти свойства вашего класса Document должны будут учитывать несколько значений, то есть они должны быть массивами или списками.

0 голосов
/ 25 ноября 2010

Вы должны создать три соединительные таблицы (скажем, period_docuemnts, pupil_documents и report_documents).Это может быть немного более общим, чем необходимо (один документ также может принадлежать нескольким периодам с этим), но это более нормально.

...