2012-08-23 3 views
0

J'ai une conception de base de données que je voudrais obtenir quelques commentaires/aide avec. Je possède 3 entités différentes: Cities, TimeZones, Rules.My World_Time DataBase design/ORM

  • un City est associé à 1 et seulement 1 TimeZone (non < 1, pas> 1: seulement 1)
  • un TimeZone peut être associé à de nombreux Cities (pas sûr du nombre minimum de villes).
  • un TimeZone a exactement 2 Rules (DST et ST).
  • chaque Rule peut être associée à beaucoup de différents TimeZones

J'ai conçu mes tableaux à l'aide du Designer ORM juste pour me aider à visualiser:

My Database ORM

Dans ce ORM, il y a:

  • une relation un à plusieurs entre le parent TimeZones et l'enfant Cities
  • un à plusieurs entre le parent TimeZones et l'enfant TimeZoneRule
  • un à plusieurs entre le parent Rule et l'enfant TimeZoneRule

Maintenant, pour mes questions:

  • Will ce beaucoup à beaucoup de travail de table de jonction? Comment puis-je savoir ce que Rule appartient à ce TimeZone? J'ai la propriété TimeZone.RuleName pour aller chercher le Rule pour un TimeZone mais que faire si je voulais revenir en arrière, par exemple trouver tous les TimeZones auxquels une règle s'applique?

  • Comment puis-je autour de l'aide d'une chaîne (RuleName) pour trouver le Rule TimeZone depuis un TimeZone a 2 règles (avec le même nom, mais est différent/ID unique).

  • Comment remplir cette table de jonction avec les bons ID/lignes?

  • Je sais City a une TimeZoneId que j'ai ajouté les valeurs réelles pour, et je peux utiliser ce TimeZoneId pour trouver le TimeZone un City appartient, mais comment puis-je trouver tous les Cities un TimeZone contient?

Ci-dessous je collais le code TSQL je l'ai écrit pour créer ces tables, la seule chose que je n'ai pas sont les associations comme je l'ai jamais fait dans les associations TSQL (clairement).

  USE World_Time 

      IF OBJECT_ID('timezones', 'U') IS NOT NULL 
       DROP TABLE timezones; 
      IF OBJECT_ID('rules', 'U') IS NOT NULL 
       DROP TABLE rules; 
      IF OBJECT_ID('leaps', 'U') IS NOT NULL 
       DROP TABLE leaps; 
      IF OBJECT_ID('cities', 'U') IS NOT NULL 
       DROP TABLE cities; 
      IF OBJECT_ID('timezone_rule', 'U') IS NOT NULL 
       DROP TABLE timezone_rule; 

      CREATE TABLE timezones 
      (
       [id] INT NOT NULL PRIMARY KEY, 
       [name] VARCHAR(30) NOT NULL, 
       [bias] SMALLINT NOT NULL, 
       [rule_name] VARCHAR(10), 
       [tz_abreviation] VARCHAR(7) NOT NULL, 
       [country_code] CHAR(2) NOT NULL, 
       [country_name] VARCHAR(42) NOT NULL, 
       [comments] VARCHAR(100), 
       [coordinates] VARCHAR(20), 
       [version] ROWVERSION 
      ); 

      CREATE TABLE rules 
      (
       [id] INT NOT NULL IDENTITY PRIMARY KEY, 
       [name] VARCHAR(10) NOT NULL, 
       [bias] SMALLINT NOT NULL, 
       [start_year] SMALLINT NOT NULL, 
       [end_year] SMALLINT NOT NULL, 
       [month] TINYINT NOT NULL, 
       [date] VARCHAR(7) NOT NULL, 
       [time] TIME(0) NOT NULL, 
       [time_type] CHAR(1), 
       [letter] CHAR(1), 
       [version] ROWVERSION 
      ); 

      CREATE TABLE leaps 
      (
       [id] INT NOT NULL IDENTITY PRIMARY KEY, 
       [year] SMALLINT NOT NULL, 
       [month] VARCHAR(3), 
       [day] SMALLINT NOT NULL, 
       [time] TIME(0) NOT NULL, 
       [correction] VARCHAR(1) NOT NULL, 
       [rs] VARCHAR(1) NOT NULL, 
       [version] ROWVERSION 
      ); 

      CREATE TABLE cities 
      (
       [id] INT NOT NULL IDENTITY PRIMARY KEY, 
       [name] VARCHAR(200) NOT NULL, 
       [ascii_name] VARCHAR(200), 
       [alternate_names] VARCHAR(5000), 
       [latitude] FLOAT(24), 
       [longitude] FLOAT(24), 
       [feature_class] CHAR(1), 
       [feature_code] VARCHAR(10), 
       [country_code] CHAR(2) NOT NULL, 
       [country_code2] VARCHAR(60), 
       [population] BIGINT, 
       [elevation] INT, 
       [modification_date] DATETIME NOT NULL, 
       [admin1code] VARCHAR(20), 
       [admin2code] VARCHAR(80), 
       [admin3code] VARCHAR(20), 
       [admin4code] VARCHAR(20), 
       [gtopo30] INT, 
       [timezone_id] INT NOT NULL, 
       [timezone_name] VARCHAR(60) NOT NULL, 
       [version] ROWVERSION 
      ); 

      CREATE TABLE timezone_rule 
      (
       [timezone_id] INT NOT NULL, 
       [rule_id] INT NOT NULL, 
       PRIMARY KEY (timezone_id, rule_id), 
       [version] ROWVERSION 
      ); 

      -- Is this how I would populate the junction table? 
      --INSERT INTO timezone_rule 
      -- (timezone_id) 
      --SELECT id 
      --FROM timezones; 
      --INSERT INTO timezone_rule 
      -- (rule_id) 
      --SELECT id 
      --FROM rules; 

Je présenter des excuses pour le poste monstrueuses que je viens d'essayer de le faire pendant des mois et je me suis marre Binging/googler pendant des heures tous les jours: P Merci d'avoir pris le temps de lire, j'apprécie beaucoup il/

-Francisco

Répondre

0

Je vais sauter sur la partie de savoir si vous avez vraiment besoin/devrait faire au lieu d'utiliser les bibliothèques standard et répondre simplement à la question d'une cartographie fuseau horaire à deux règles.

Timezone a un RuleId. Il pourrait avoir deux RuleId s:

  • DstRuleId
  • StRuleId

Par exemple:

 CREATE TABLE timezones 
     (
      [id] INT NOT NULL PRIMARY KEY, 
      [name] VARCHAR(30) NOT NULL, 
      [bias] SMALLINT NOT NULL, 

      [dst_rule_id] INT, 
      [st_rule_id] INT, 

      [tz_abreviation] VARCHAR(7) NOT NULL, 
      [country_code] CHAR(2) NOT NULL, 
      [country_name] VARCHAR(42) NOT NULL, 
      [comments] VARCHAR(100), 
      [coordinates] VARCHAR(20), 
      [version] ROWVERSION 
     ); 

Ce serait plus simple. Pour une plus grande flexibilité, et d'aller sur la route plus relationnelle, une table RuleType pourrait être introduite qui commence avec seulement deux entrées:

  • DST
  • ST

Cela permettrait à la possibilité d'étendre les règles à l'avenir. Mais alors vous auriez besoin d'un mappage de la table Rule vers la table RuleType et le tableau TimeZoneRule ferait référence à ces mappages. Il est plus facile d'utiliser un DstRuleId et un StRuleId s'il y a une grande confiance que cela ne va pas changer.

  • Trouvez tous les Fuseaux horaires auxquels s'applique une règle?

    SELECT timezoneid FROM TimeZoneRule WHERE RuleId = ?

  • Comment puis-je autour de l'aide d'une chaîne (RuleName) pour trouver la règle de TimeZone depuis un TimeZone a 2 règles (avec ce même nom mais différent/ID unique).

    implicite si vous avez les deux colonnes TimeZoneRule

  • Comment puis-je remplir ce tableau de jonction avec ANNEES/lignes droite ID?

    INSERT INTO timezone_rule(timezone_id, rule_id) VALUES (?, ?)

  • Je sais que la ville a une TimeZoneID que j'ai ajouté les valeurs réelles pour, et je peux utiliser ce TimeZoneID pour trouver la TimeZone une ville appartient, mais comment puis-je trouver toutes les villes un TimeZone contient?

    SELECT id FROM city WHERE timezone_id = ?

+0

La raison pour laquelle je ne suis pas en utilisant des bibliothèques standard est parce que ce sera une base de données locale sur une application Windows Phone, qui, malheureusement, ne contient pas les bibliothèques. –