2009-07-27 40 views
6

Tôi có một số thực thể mà tôi yêu cầu người dùng có thể thêm trường tùy chỉnh vào.Trường tùy chỉnh với SQL Server 2008

Nếu tôi có một thực thể gọi là khách hàng với các biến số cơ sở như {Name, DateOfBirth, StoreID} và một số khác gọi là Store với {Name}

Sau đó, tôi muốn nó để chủ sở hữu của cửa hàng có thể đăng nhập và thêm một biến mới cho tất cả khách hàng của họ được gọi là màu yêu thích, đó là danh sách thả xuống có màu đỏ, xanh lục hoặc xanh dương làm tùy chọn.

Bây giờ tôi đã có một cái nhìn tại EAV và đưa ra một giải pháp mà trông giống như

Thuộc tính này {StoreID, Tên, DataType}, Value {AttributeId, Tên pháp nhân, ENTITYID, Value}

Tôi tự hỏi là có một số giải pháp mà sẽ làm việc tốt nhất cho SQL Server 2008 đặc biệt là cho rằng tôi sẽ muốn để có thể xem và truy vấn thông tin này một cách dễ dàng.

Tôi đã nghe nói rằng bạn có thể truy vấn trong loại dữ liệu xml. Đó có phải là cách tốt hơn để đi không?

Tôi cũng có thể muốn người dùng có thể thêm các trường tùy chỉnh là khóa ngoài tại một số điểm.

Sẽ xem xét cả ngày này để đặt câu hỏi nhanh chóng.

Trả lời

4

EAV nói chung là một mẫu chống gây ra hiệu suất ảm đạm và làm tắc nghẽn khả năng mở rộng. Bây giờ nếu bạn quyết định đi với EAV, Nhóm tư vấn khách hàng SQL Server đã xuất bản một bài báo trắng với những cạm bẫy và vấn đề phổ biến và cách tránh chúng: Best Practices for Semantic Data Modeling for Performance and Scalability.

Truy vấn một kiểu dữ liệu XML là có thể trong SQL, nhưng nếu XML của bạn không có lược đồ thì truy vấn nó sẽ chậm. Nếu nó có một lược đồ và lược đồ là EAV, thì nó sẽ có tất cả các vấn đề của EAV quan hệ cộng với một số vấn đề của nó cho hiệu năng XML. một lần nữa những người tốt của nhóm CAT đã xuất bản một vài bài báo trắng về chủ đề: XML Best Practices for Microsoft SQL Server 2005Performance Optimizations for the XML Data Type in SQL Server 2005. Chúng cũng hợp lệ cho SQL 2008.

2

Tôi đã sử dụng các tính năng XML của SQL 2005/2008 trong một thời gian. Tôi đã đến để dựa vào các cột XML khá một chút. Những gì bạn muốn làm âm thanh như ứng viên hoàn hảo cho XML. Ví dụ: Đoạn mã sau xác định 2 thực thể của bạn (@customers và @stores), với cột được gọi là "attrs" có thể được mở rộng để bao gồm nhiều thuộc tính hơn. Tôi hy vọng điều này sẽ hữu ích!

declare @customers as table (id int, attrs xml); 
INSERT INTO @customers VALUES 
    (1,'<Attrs Name="Peter" DateOfBirth="1996-01-25" StoreId="10" />'), 
    (2,'<Attrs Name="Smith" DateOfBirth="1993-05-02" StoreId="20" />') 
; 
declare @stores as table (id int, attrs xml); 
insert into @stores VALUES 
    (10, '<Attrs Name="Store1" />'), 
    (20, '<Attrs Name="Store2" />') 
; 
With c as (
    select id as CustomerID, 
     attrs.value('(/Attrs[1])/@Name', 'nvarchar(100)') as Name, 
     attrs.value('(/Attrs[1])/@DateOfBirth', 'date') as DateOfBirth, 
     attrs.value('(/Attrs[1])/@StoreId', 'int') as StoreId 
    from @customers 
), s as (
    select id as StoreID, 
     attrs.value('(/Attrs[1])/@Name', 'nvarchar(100)') as Name 
    from @stores 
) 
select * 
from c left outer join s on (c.StoreId=s.StoreID); 
1

Đã có câu trả lời hay. Tôi sẽ chỉ thêm gợi ý rằng bạn duy trì siêu dữ liệu cho các trường tùy chỉnh. Điều này sẽ làm cho một giao diện người dùng để nhập các trường tùy chỉnh dễ dàng hơn - bạn có thể giới hạn tập các trường tùy chỉnh cho một khách hàng, và để xác định DateOfBirth đó là một ngày, và StoreID đó có nghĩa là khớp với ID của một cửa hàng thực tế.

Một số siêu dữ liệu này có thể được duy trì dưới dạng lược đồ XML. Tôi đã nhìn thấy rằng thực hiện, với các lược đồ được lưu trữ trong cơ sở dữ liệu, và được sử dụng để xác nhận các lĩnh vực tùy chỉnh được đầu vào. Tôi không biết liệu các lược đồ đó cũng có thể được sử dụng để đánh mạnh dữ liệu XML hay không.

Các vấn đề liên quan