2010-11-23 1 views
2

ich auf die Gestaltung der Tabellen in dieser Datenbank ein paar Ratschläge hören möchte ...In SQL wie kann ich erhöhen id wie folgt aus: client1, client2, client3

Sagen wir, ich habe 3 Tabellen: Hemden, Hosen und Schuhe

Sie alle haben die gleichen Felder: Name, Beschreibung, Herstellung, Material und ID Ich kann nicht einfach die IDs als 1, 2, 3, 4 für jeden von ihnen, also habe ich beschlossen, ein Notation: shirt001, shirt002, pants001, pants002, pants003 und so weiter. Ich weiß, dass dies nicht die richtige Art ist, es zu entwerfen, also sollte ich es einfach in eine große Tabelle kombinieren und die Felder als Name, Beschreibung, Herstellung, Material, ID mit einem zusätzlichen 'Typ' Feld haben?

+2

Warum können Sie nicht die IDs als 1,2,3,4 setzen, ... Ihre Daten sind in verschiedene Tabellen, damit Sie keine Kollisionen haben. Ich verstehe nicht, was das Problem ist. – davidk01

+0

Wenn ich eine Textsuche mache, (Name, Beschreibung, Herstellung, Material, ID aus Hemden, Hosen, Schuhe) gibt es zurück: Spalte 'ID' in der Feldliste ist mehrdeutig. Ich teste das auf WAMP. – stockoverflow

+1

Siehe meine Antwort unten, eine ID, die für mehrere Typen verwendet wird, ist schlechtes Design, und könnte Sie in Probleme führen. – Greg

Antwort

3

Ja, sollten Sie eine Datenbanktabelle machen, die all die verschiedenen Produkte definiert:

Table: Product 
Columns: ID (pk, identity), 
     ProductTypeID (fk to ProductType table), 
     Name, 
     Description, 
     Manufacture, 
     Material 

Table: ProductType 
Columns: ID (pk, identity), 
     Name, 
     Description 
+0

Dank Yaakov, wissen Sie, ob MySQL MyISAM Fremdschlüssel und dergleichen haben kann? – stockoverflow

+1

Sieht aus wie MySQL 5.0, MyISAM unterstützt keine Fremdschlüsseleinschränkungen - http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-foreign-keys.html. Momentan wird es nur von InnoDB unterstützt, obwohl es für MyISAM in einer späteren Version "geplant" ist. –

+0

Danke. Uhh das ist schlecht ... werde meine ganze DB zu InnoDB wechseln müssen. – stockoverflow

0

EDIT: MySQL hinzugefügt unten Antwort

Die Datenbankdesign Sie zitieren haftet nicht an der ersten Normalform (1NF).

Es wäre besser für Sie, wenn Sie Ihre Datenbank in mehrere Tabellen mit einer Tabelle Typ aufteilen. Dies würde eine relationale Datenbank erzeugen, die keine Duplizierung hat, und die IDs würden nicht kollidieren, wenn ein Benutzerfehler auftritt.

Table: Item 
     Id   (int, auto-increment) [PrimaryKey] 
     FkTypeId (int) [ForeignKey] 
     Name  (string) 
     Description (string) 
     Material (string) 
     Manufacture (string) 

Table: Type 
     Id   (int, auto-incrememnt) [PrimaryKey] 
     Name  (string) 

Sie können jetzt Ihre Arten in die Typ-Tabelle (Hemd, Hose, Schuhe, etc.) einsetzen und jedes Element mit ihrem relavent Typ zuordnen.

Hier ist eine Wikipedia-Seite auf dem ersten Normalform, etwas, das Sie sollten in jedem Datenbank-Design zu haften versuchen: http://en.wikipedia.org/wiki/First_normal_form

Hier ist MySQL Version meines Vorschlags:

HINWEIS DIESER IN WORKS MyISAM

CREATE TABLE ProductType (
    Id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    Name VARCHAR NOT NULL , 
PRIMARY KEY(Id)); 


CREATE TABLE Product (
    Id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    ProductType_Id INTEGER UNSIGNED NOT NULL , 
    FkTypeId INTEGER UNSIGNED NOT NULL , 
    Name VARCHAR NOT NULL , 
    Description VARCHAR NOT NULL , 
    Material VARCHAR NULL , 
    Manufacturer VARCHAR NULL , 
PRIMARY KEY(Id, ProductType_Id) , 
INDEX Product_FKIndex1(ProductType_Id), 
    FOREIGN KEY(ProductType_Id) 
    REFERENCES ProductType(Id) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION); 

Hoffnung, das hilft.

+0

Danke Greg. Schnelle Frage, wenn es Ihnen nichts ausmacht: Was ist die SQL, die FROM [keine Tabelle] entspricht? – stockoverflow

+0

@stockoverflow hinzugefügt die MySQL-Version – Greg

+0

Super, danke. – stockoverflow

0

Ja, setzen Sie es in eine einzelne Tabelle, mit einem Fremdschlüssel TypeID, der auf eine Tabelle ItemTypes verweist.

+1

Jeder spezifische Grund für die Abstimmung unten? Kümmern Sie sich nicht um positive Kritik ... –

+0

War ich nicht (nicht registriert), vielleicht war es zu kurz? – stockoverflow

+1

Ich denke, es hat viel die ursprüngliche Frage abgedeckt? Denkst du nicht? –

Verwandte Themen