2011-03-21 47 views
10

Tengo una pregunta sobre cómo diseñaría algunas tablas en mi base de datos. Tengo una tabla para rastrear Categorías y otro para las subcategorías:Pregunta de diseño de la base de datos - Categorías/Subcategorías

TABLE Category 
    CategoryID INT 
    Description NVARCHAR(500) 

TABLE Subcategory 
    SubcategoryID INT 
    CategoryID INT 
    Description NVARCHAR(500) 

Una categoría podría ser algo así como Electrónica, y sus subcategorías podría ser reproductores de DVD, televisores, etc.

Tengo otra tabla que se va hacer referencia a la Categoría/Subcategoría. ¿Necesita hacer referencia al SubcategoryID?

TABLE Product 
    SubcategoryID INT -- should this be subcategory? 

¿Hay una manera mejor de hacer esto o es esta la manera correcta? No soy un tipo de diseño de bases de datos. Estoy usando SQL Server 2008 R2 si eso importa.

+0

su enfoque funciona bien y es (consultas sencillas) simples para un escenario particular (categorías que tienen subcategorías), pero no es muy extensible, si tiene otro requerimiento como niveles más profundos de subcategorías en subcategorías, vaya con la tabla única agregando un parent_id – BlackTigerX

Respuesta

10

Su diseño es apropiado.Soy un tipo de base de datos convertido en desarrollador, por lo que puedo entender la inclinación a tener categorías y subcategorías en una tabla, pero nunca se puede equivocar con KISS.

A menos que el rendimiento extremo o la jerarquía infinita sea un requisito (supongo que no), ya está listo.

Si es necesario poder asociar varias subcategorías con un producto, para el punto de @ Mikael, necesitaría una configuración como esta que crea una relación de muchos a muchos a través de una tabla join/intersect, Product_SubCategory:

CREATE TABLE Product (ProductID int, Description nvarchar(100)) 
CREATE TABLE Product_SubCategory (ProductID int, SubCategoryID int) 
CREATE TABLE SubCategory (SubCategoryID int, CategoryID int, Description nvarchar(100)) 
CREATE TABLE Category (CategoryID int, Description nvarchar(100)) 

Espero que ayude ...

Eric Tarasoff

+0

definitivamente ayudado – Freelancer

+0

¿Esto me permite hacer múltiples subcategorías? – TransformBinary

+0

Esto dice que un producto puede tener múltiples subcategorías (y viceversa) ... pero una subcategoría está ligada a una sola categoría. –

2

Si las categorías y subcategorías tienen los mismos atributos, colóquelos en una tabla.

Si una categoría 'sub' puede pertenecer a más de una categoría 'principal', entonces agregue una clase de enlace, de lo contrario agregue una sola columna para señalar a un elemento primario.

p. Ej. si tiene Electrónica> TV, ¿también puede tener Entretenimiento> TV? etc.

Su otra mesa debe hacer referencia sólo la category_id (nota - no parent_category_id)

hth

+0

Me gustaría que estén separados pero no estoy seguro de que tengan que estarlo. Por lo menos, necesito poder recuperar categorías de "nivel superior" por separado. – Dismissile

+0

En este esquema, las categorías de nivel superior se definen como todas las categorías que no tienen categorías principales. Parece un diseño limpio para mí. – Martijn

0

Mientras Subcategorias no se repitan en una categoría diferente, y especialmente si tienen diferentes atributos , entonces tu método propuesto es bueno.

El único problema puede surgir cuando agrega/edita Productos, y no tiene un campo para Categoría, aunque probablemente desee un control donde el usuario pueda editar la Categoría.

3

Tener dos tablas separadas para Categories y SubCategories depende de su situación.

Si lo mantienes como estás, estás limitado a un escenario Categoría> Subcategoría, ya que no puedes tener Subcategorías de Subcategorías.

Si las convierte en una tabla, necesita una columna para ParentID. Si una categoría es la más alta, tendrá un ParentID de 0. Si desea permitir subcategorías ilimitadas de subcategorías foreach, p. Ej. Electronics > Recordable Media, Blueray, 4gb tendrá que usar programación recursiva para visualizarlos.

1

Depende de sus requisitos. Si cada Producto está vinculado a no más de una Subcategoría, debe tener SubCategoryID en Productos. No es necesario agregar CategoryID también.

Otros escenarios que requieren un modelo diferente podrían ser que un Producto podría vincular directamente a una Categoría en lugar de una Subcategoría o que un Producto podría vincularse a más de una Subcategoría o que una Subcategoría está vinculada a más de una Categoría.

+0

Creo que el nivel de "Categoría" es como un súper nivel donde ningún producto debe vincularse directamente, siempre debe haber una subcategoría para vincular productos. – NoChance

3

Adjunte etiquetas a los productos en lugar de una jerarquía de categorías. Es mucho más flexible.

create table product (id, name,...) 
create table tag (id, name, description) 
create table product_tag (product_id, tag_id) 
+0

¿Ayudarán las etiquetas de producto para el ** nivel de categoría ** de tercer y cuarto nivel? – stom

Cuestiones relacionadas