Frage

[UPDATE] gewählter Ansatz ist unten, als eine Antwort auf diese Frage

Hallo,

ich bin umsah in diesem Thema, aber ich kann nicht wirklich finden, was ich suche ...

Mit Codetabellen ich meine: Sachen wie ‚maritial Status‘, Geschlecht, bestimmte rechtliche oder soziale Staaten ... Insbesondere haben diese Typen nur gesetzt Eigenschaften und die Einzelteile sind nicht zu schnell ändern (aber könnten). Eigenschaften ist eine Id, einen Namen und eine Beschreibung ein.

Ich frage mich, wie diese am besten in den folgenden Technologien behandeln:

  • in der Datenbank (mehrere Tabellen, eine Tabelle mit unterschiedlichem Code-Schlüssel ...?)

  • , um die Klassen zu schaffen (wahrscheinlich so etwas wie Vererbungs ICode mit ICode.Name und ICode.Description)

  • die Ansicht / Moderator für diese zu schaffen: Es sollten alle von ihnen enthalten, so dass eine Liste der Arten (Geschlecht, maritial Status ...) und dann eine Liste von Werten für diese Art ein Bildschirm sein mit ein Name & Beschreibung für jedes Element in der Wert-Liste.

Dies sind Dinge, die in jedem einzelnen Projekt erscheinen, so muss es einig Best-Practice sein, wie diese zu behandeln ...

Für das Protokoll, ich bin nicht wirklich gern Aufzählungen für diese Situationen mit ... Alle Argumente auf sich hier verwendet, sind ebenfalls willkommen.

[FOLLOW UP]

Ok, ich habe eine nette Antwort von CodeToGlory und Ahsteele bekommen. Lassen Sie uns diese Frage verfeinern.

Sagen wir reden hier nicht über Geschlecht oder maritial Status, weichen Werte ändern sich auf jeden Fall nicht, aber über „Sachen“, die einen Namen und eine Beschreibung, aber nichts mehr. Zum Beispiel:. Sozialstatus, Rechtsstatus

UI: Ich möchte nur einen Bildschirm für diese. Listbox mit possibe NameAndDescription Typen (ich nenne sie nur das), Listbox mit den möglichen Werten für den ausgewählten NameAndDescription Typ, und dann ein Name und Beschreibung Feld für den NameAndDescription Typ Artikel ausgewählt.

Wie kann das in View & Presenters behandelt werden? Ich finde die Schwierigkeit, dass die NameAndDescription Typen würden dann aus dem Klassennamen extrahiert werden?

DB: Was sind Pro / Nachteile für mehr vs Single-Lookup-Tabellen?

War es hilfreich?

Lösung 3

Ich habe beschlossen, mit diesem Ansatz zu gehen:

CodeKeyManager mgr = new CodeKeyManager();
CodeKey maritalStatuses = mgr.ReadByCodeName(Code.MaritalStatus);

Dabei gilt:

  • CodeKeyManager können abrufen CodeKeys von DB (CodeKey = MaritalStatus)
  • -Code ist eine Klasse mit Konstanten gefüllt, Streichern so Code.MaritalStatus = "maritalStatus" zurück. Diese Konstanten Karte auf zum CodeKey table> CodeKeyName
  • In der Datenbank, ich habe 2 Tabellen:
    • CodeKey mit Id, CodeKeyName
    • CodeValue mit CodeKeyId, Valuename, ValueDescription

DB:

alt text http://lh3.ggpht.com/_cNmigBr3EkA /SeZnmHcgHZI/AAAAAAAAAFU/2OTzmtMNqFw/codetables_1.JPG

Klassencode:

public class Code
{
    public const string Gender = "gender";
    public const string MaritalStatus = "maritalStatus";
}

Klasse CodeKey:

public class CodeKey
{
    public Guid Id { get; set; }
    public string CodeName { get; set; }

    public IList<CodeValue> CodeValues { get; set; }
}

Klasse CodeValue:

public class CodeValue
{
    public Guid Id { get; set; }

    public CodeKey Code { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

}

Ich finde bei weitem die einfachste und efficent Art und Weise:

  • Alle Code-Daten (in dem gleichen Ansicht / Moderator) in einer identischen Art und Weise angezeigt werden
  • Ich brauche keine Tabellen und Klassen für jede Code-Tabelle zu erstellen, die noch kommen
  • Aber ich kann sie immer noch aus leicht von der Datenbank erhalten und nutzen sie einfach mit dem Codeschlüssel-Konstanten ...
  • NHibernate kann damit umgehen leicht zu

Das einzige, was ich noch bedenkt, ist die GUID-IDs und mit string (nchar) Codes für die Benutzerfreundlichkeit in der Business-Logik werfen.

Danke für die Antworten! Wenn es irgendwelche Anmerkungen zu diesem Ansatz sind, bitte!

Andere Tipps

Tabellen Datenbank gefahrene Code verwenden, können sehr nützlich. Sie können Dinge tun, die Lebensdauer der Daten definieren (mit Anfangs- und Enddatum), fügen Daten in die Tabelle in Echtzeit, so dass Sie Code nicht bereitstellen müssen, und Sie können Benutzer erlauben (mit den richtigen Privilegien natürlich) fügen Sie Daten durch Admin-Bildschirmen.

würde ich empfehlen, immer einen Autowert Primärschlüssel, anstatt den Code oder die Beschreibung verwendet. Dies ermöglicht Ihnen, mehrere Codes zu verwenden (mit dem gleichen Namen, aber unterschiedlichen Beschreibungen) über verschiedene Zeiträume. Plus die meisten DBAs (nach meiner Erfahrung) eher verwenden Sie den Autowert über textbasierte Primärschlüssel.

würde ich eine einzelne Tabelle pro codierte Liste verwenden. Sie können mehrere Codes alle in eine Tabelle setzen, die nicht betreffen (eine Matrix von Sorten verwendet), aber das wird chaotisch und ich habe festgestellt, nur ein paar Situationen, in denen es auch nützlich war.

Ein paar Dinge hier:

  1. Verwenden Sie Aufzählungen, die explizit klar sind und wird sich nicht ändern. Zum Beispiel MaritalStatus, Geschlecht etc.

  2. Verwenden Lookup-Tabellen für Elemente, die nicht festgelegt sind, wie oben und kann Zunahme / Abnahme im Laufe der Zeit ändern.

Es ist sehr typisch Lookup-Tabellen in der Datenbank zu haben. Definieren Sie einen Schlüssel / Wert-Objekt in Ihrem Business-Tiere, die mit Ihrer Ansicht / Präsentation arbeiten kann.

Ich lehne eine Tabellendarstellung für diese Art von Daten zu verwenden. Letztlich die Daten, wenn Sie eine Notwendigkeit, zu erfassen, werden Sie eine Notwendigkeit, es speichern müssen. Für Berichtszwecke ist es besser, einen Ort zu haben, dass die Daten aus über einen Schlüssel ziehen. Für die Normierung finde ich einzige Zweck Lookup-Tabellen einfacher zu sein als eine Mehrzweck-Lookup-Tabellen.

Wie gesagt Aufzählungen für die Dinge ziemlich gut arbeiten, wie Geschlecht nicht usw. ändern.

Warum will jede Codetabelle erschweren? Ja, es gibt viele von ihnen, aber sie sind einfach, so sie auf diese Weise halten. behandeln sie wie immer ein anderes Objekt. Thy ist Teil der Domäne, so modellieren sie als Teil der Domäne, nichts Besonderes. Wenn Sie nicht tun, wenn sie inevitibly mehr Attribute oder Funktionen benötigen, müssen Sie den gesamten Code rückgängig zu machen, die derzeit verwendet es und überarbeiten sie.

Eine Tabelle pro natürlich (für referentielle Integrität und so, dass sie für die Berichterstattung zur Verfügung stehen).

Für die Klassen wieder einen pro natürlich, denn wenn ich eine Methode schreibe ein „Gender“ Objekt zu empfangen, will ich nicht in der Lage sein, es versehentlich passiert einen „MarritalStatus“! Lassen Sie die Kompilierung Hilfe Sie Laufzeitfehler auszumerzen, das ist, warum seine dort. Jede Klasse kann einfach erben oder eine Codetable-Klasse enthalten oder was auch immer, aber das ist einfach ein Implementierung Helfer.

Für das UI, wenn es in der Tat nicht verwendet die geerbte Codetable, nehme ich an, dass Sie zu helfen, verwenden könnte und es nur in einer Benutzeroberfläche zu erhalten.

In der Regel verwirrt nicht das Datenbankmodell auf, nicht vermasselt das Geschäftsmodell, aber es Ihnen wnt um ein bisschen im UI-Modell schrauben, das ist nicht so schlimm.

Ich möchte diesen Ansatz betrachten Vereinfachung sogar noch mehr. Anstelle von drei Tabellen definieren Codes (Code, Codeschlüssel und CodeValue), wie etwa nur eine Tabelle, die enthält sowohl die Code-Typen und die Code-Werte? Schließlich sind die Code-Typen nur eine andere Liste von Codes.

Vielleicht eine Tabellendefinition wie folgt aus:

CREATE TABLE [dbo].[Code](
    [CodeType] [int] NOT NULL,
    [Code] [int] NOT NULL,
    [CodeDescription] [nvarchar](40) NOT NULL,
    [CodeAbreviation] [nvarchar](10) NULL,
    [DateEffective] [datetime] NULL,
    [DateExpired] [datetime] NULL,
CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED 
(
    [CodeType] ASC,
    [Code] ASC
)
GO

Es könnte eine Wurzeldatensatz mit Codetype = 0 sein, Code = 0, die den Typ für Codetype darstellt. Alle des Codetype-Datensätze einen Codetype = 0 und einen Code> = 1. Hier einige Beispieldaten, die helfen könnten Dinge zu klären:

SELECT CodeType, Code, Description FROM Code

Results:

CodeType    Code    Description
--------    ----    -----------
0           0       Type
0           1       Gender
0           2       Hair Color
1           1       Male
1           2       Female
2           1       Blonde
2           2       Brunette
2           3       Redhead

Eine Überprüfung Einschränkung der Code-Tabelle hinzugefügt werden könnte, um sicherzustellen, dass eine gültige Codetype wird in die Tabelle eingetragen:

ALTER TABLE [dbo].[Code] WITH CHECK ADD CONSTRAINT [CK_Code_CodeType]   
CHECK (([dbo].[IsValidCodeType]([CodeType])=(1)))
GO

Die Funktion IsValidCodeType wie folgt definiert werden:

CREATE FUNCTION [dbo].[IsValidCodeType]
(
    @Code INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @Result BIT
    IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = 0 AND Code = @Code)
        SET @Result = 1
    ELSE
        SET @Result = 0
    RETURN @Result
END
GO

Ein Problem, das angesprochen wurde ist, wie sichergestellt wird, dass eine Tabelle mit einer Spalte Code einen richtigen Wert für diesen Codetyp hat. Auch dies könnte durch eine Check-Einschränkung erzwungen werden unter Verwendung einer Funktion.

Hier ist eine Tabelle Person, die eine gender-Spalte hat. Es könnte eine bewährte Methode, um alle Codespalten mit der Beschreibung des Codetypen (Gender in diesem Beispiel zu nennen) mit dem Wort-Code gefolgt:

CREATE TABLE [dbo].[Person](   
    [PersonID] [int] IDENTITY(1,1) NOT NULL,
    [LastName] [nvarchar](40) NULL,
    [FirstName] [nvarchar](40) NULL,
    [GenderCode] [int] NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC)
GO

ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [CK_Person_GenderCode] 
CHECK (([dbo].[IsValidCode]('Gender',[Gendercode])=(1)))
GO

IsValidCode diese Weise definiert werden:

CREATE FUNCTION [dbo].[IsValidCode]
(
    @CodeTypeDescription NVARCHAR(40),
    @Code INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @CodeType INT
    DECLARE @Result BIT

    SELECT @CodeType = Code
    FROM dbo.Code
    WHERE CodeType = 0 AND CodeDescription = @CodeTypeDescription

    IF (@CodeType IS NULL)
    BEGIN
        SET @Result = 0
    END
    ELSE
    BEGiN
    IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = @CodeType AND Code = @Code)
        SET @Result = 1
    ELSE
        SET @Result = 0
    END

    RETURN @Result
END
GO

könnte eine andere Funktion erstellt werden, um die Code-Beschreibung zu liefern, wenn eine Tabelle Abfragen, die eine Code-Spalte hat. Hier ist ein Beispiel für die Tabelle Person Abfrage:

SELECT PersonID,
    LastName,
    FirstName,
    GetCodeDescription('Gender',GenderCode) AS Gender
FROM Person

Das alles wurde aus Sicht der Verhinderung der Verbreitung von Lookup-Tabellen in der Datenbank konzipiert und bietet eine Lookup-Tabelle. Ich habe keine Ahnung, ob dieser Entwurf in der Praxis gut durchführen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top