2010-11-18 32 views
0

Brief: Je suis relativement nouveau dans les bases de données et en possède actuellement une avec deux tables pour un script de type checker. Y at-il un moyen de s'assurer que les deux tables utilisent les mêmes types de colonnes? Cette base de données est dans Sybase.Forcer plusieurs tables à avoir les mêmes colonnes dans une base de données

Détail: La première table est essentiellement un journal de chaque chèque jamais fait par le script (Disons que il y a 106 contrôles dans une course, donc il [Nombre de pistes] x [Aucun des contrôles < 106 >]). La deuxième table est pour la dernière exécution, donc dans ce cas, il contiendrait 106 lignes. Ce n'est pas un nombre constant cependant, et pourrait augmenter.

Ma question est, est-il un moyen de forcer les deux tables à avoir des colonnes communes? Je vois dans la table syscolumns qu'il y a un certain nombre de lignes dédiées à chacune de ces tables, mais étant donné qu'elles sont identiques, est-ce que je peux faire en sorte que les tables tirent leurs paramètres "style" de la même source? changements sur l'un sont faits sur l'autre?

Merci!

+0

Voulez-vous dire que vous le voulez de sorte que si la définition d'une colonne dans une table est modifiée, vous voulez que la même modification soit apportée à l'autre colonne? Par exemple, si une colonne est passée de char à varchar, vous voulez que l'autre colonne soit changée de char à varchar? – YWE

+0

Oui, c'est exactement ce que je veux dire – Bharat

+0

Vous êtes censé utiliser des types de données définis par l'utilisateur ** tous ** l'heure, et n'utilisez jamais de type de données brutes. Sinon, vous n'avez aucun contrôle sur les données, exactement pour la raison identifiée dans votre question. – PerformanceDBA

Répondre

1

Une façon de gérer la relation entre plusieurs colonnes et types de données consiste à utiliser des domaines définis par l'utilisateur. Certains systèmes SGBD prennent en charge les domaines définis par l'utilisateur. D'autres ne le font pas

Le verbe en SQL est "CREATE DOMAIN". Vous pouvez rechercher les détails dans votre documentation. Puis, lorsque vous créez des tables et créez les colonnes qui composent les tables, vous utilisez les domaines que vous avez créés au lieu de spécifier les types de données et les paramètres associés. Lorsque deux colonnes sont référencées sur le même domaine, elles ont le même type de données. Ils sont également garantis d'avoir la même taille, comme le "7" dans "char (7)".

La création de domaines d'une manière qui améliore réellement votre capacité à simplifier la gestion des données par abstraction implique à la fois l'apprentissage et l'expérience. Tu dois commencer quelque part.

+0

Sybase ne prend pas explicitement en charge les domaines définis par l'utilisateur, mais je peux créer des types de données personnalisés. Je vais essayer, merci! – Bharat

+0

Dans Sybase, ils sont appelés les noms standard ANSI, les types de données pour INTEGER, etc. (ce que Walter appelle les domaines dans le terme logique); Règles pour les domaines. Ils sont supportés. – PerformanceDBA

2

Si vous devez avoir plusieurs tables avec exactement la même structure de colonnes, la normalisation suggère que les données appartiennent probablement toutes à une seule table. Je comprends qu'il y a quelques avantages à dénormaliser les données, mais puisque vous admettez que vous êtes nouveau dans les bases de données, je vais essayer de trouver un moyen de normaliser en premier.

+0

Je vois ce que vous dites, et comme toutes les données de la table plus petite existent dans le tableau plus grand, elles sont en fait dupliquées. Mais ma ligne de pensée est que garder deux tables signifie que le premier est un journal alors que les applications qui ont besoin de l'état actuel de tous les systèmes peuvent simplement (SELECT *). La seconde base de données n'est mise à jour qu'une fois qu'une instruction est insérée. De cette façon, l'interface est plus simple et les applications n'ont pas à interroger le journal pour obtenir la dernière vérification disponible (dans le cas où une vérification n'a pas été écrite dans le journal). Cela a-t-il du sens? Cela ne vaut-il toujours pas l'état dé-normalisé? – Bharat

+0

Il semble que cela puisse justifier une dénormalisation. Cependant, une table bien indexée dans un SGBDR approprié devrait fonctionner correctement même si elle est grande. Vous risquez également de désynchroniser votre journal avec votre état actuel si vous stockez les données dans deux tables. – Tenner

+0

@Bharat. Alors, apportez votre application 'SELECT TOP 1 ORDER BY Id DESC' et perdez la table redondante. – PerformanceDBA

1

Vous décrivez une situation étrange. Généralement, une fois que les tables ont été conçues et implémentées et que les applications commencent à les utiliser, elles ne sont pas modifiées. Certes, ils sont très rarement modifiés dans le cours normal des affaires (c'est-à-dire tous les jours ou même chaque semaine).

Dans quelles circonstances voyez-vous le besoin de colonnes supplémentaires? S'il s'agit d'une situation récurrente (et j'en ai eu quelques-uns), vous devez écrire un programme pour ajouter les colonnes, ce qui garantit que les tables restent synchronisées. Si les tables doivent être "manuellement" modifiées, cela est généralement fait par une personne ayant des droits au niveau de l'administrateur, et les administrateurs peuvent faire ce qu'ils veulent (peut-être par erreur), quelle que soit l'intention du concepteur original. Votre meilleure défense ici serait de documenter les exigences du système, et assurez-vous qu'ils sont connus et disponibles pour tous ceux qui pourraient avoir à utiliser les tables.

+0

Merci, les tables ne vont pas vraiment être changées une fois qu'elles sont implémentées, mais je les implémente toujours, et je me demandais s'il y avait un moyen de rendre ma vie (et celle des futurs responsables) un peu plus facile. La documentation pourrait être la voie à suivre dans ce cas. – Bharat