Mam kilka baz danych utworzonych za pomocą Entity Framework Code First; aplikacje działają i ogólnie jestem całkiem zadowolony z tego, co pozwala mi Code First. Najpierw jestem programistą, a po drugie DBA. Czytam o DataAttributes, aby dalej opisać w C #, co chcę, aby baza danych zrobiła; a moje pytanie brzmi: jaką karę będę jadł, mając te nvarchar(max)
łańcuchy na stole (patrz przykład poniżej)?
W tej konkretnej tabeli znajduje się kilka kolumn; w języku C # są one zdefiniowane jako takie:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
public string Source { get; set; }
public DateTime Generated { get; set; }
public DateTime Written { get; set; }
Oczekuję zapytania i / lub sortowania na podstawie nazwy, źródła, wygenerowanego i zapisanego. Oczekuję, że Nazwa i Źródło będą miały długość 0-50 znaków, czasami nawet do 150. Spodziewam się, że ta tabela zacznie być dość mała (<100 tys. Rzędów), ale z czasem znacznie wzrośnie (> 1m wierszy). Oczywiście wiadomość może być mała lub duża i prawdopodobnie nie będzie się o nią pytać.
Chcę wiedzieć, czy w mojej kolumnie Nazwa i Źródło zdefiniowano trafienie wydajnościowe, nvarchar(max)
gdy nigdy nie oczekuję, że będą miały więcej niż 150 znaków?
varchar(max)
wszędzie szkodzi Twojej wydajności - nie rób tego! Używaj odpowiednich typów danych - używaj varchar(max)
TYLKO, jeśli NAPRAWDĘ potrzebujesz więcej niż 8000 znaków! (Nigdy nie widziałem, aby imię i adres e-mail osoby były tak długie!) - Zobacz, jaki jest sens używania VARCHAR (n)? po więcej informacji
[MaxLength]
lub[StringLength]
atrybuty. Niektóre dodatkowe możliwe negatywne czynniki zbyt szerokich kolumn są wymienione w odpowiedzi @ PaulWhite tutaj